Значение должно быть 0 между двумя датами?

Использование SQL Server 2000

Я хочу сравнить table2.date между table1.from, table1.todate, если существует, то значение должно быть 0 (ноль)

Таблица 1

ID FromDate ToDate

001 20090801 20090815
002 20090817 20090820
…,

Таблица 2

Id Date Value

001 20090730 100
001 20090731 200
001 20090801 300
001 20090802 400
…
001 20090815 0
001 20090816 250
…

Из двух приведенных выше таблиц я хочу ID, Date, значение из table2, где table2.date между table1.fromdate и table1.todate, затем table2.value = 0

Ожидаемый результат

Id Date Value

001 20090730 100
001 20090731 200
001 20090801 0
001 20090802 0
…

001 20090815 0
001 20090816 250

Как сделать запрос для этого условия?


person Gopal    schedule 08.10.2009    source источник


Ответы (1)


Это покажет value для имеющихся записей, 0 для отсутствующих записей:

SELECT  t2.id, t2.date,
        COALESCE(
        (
        SELECT  TOP 1 t2.value
        FROM    table1 t1
        WHERE   t2.date BETWEEN t1.fromdate AND t1.todate
                AND t2.id = t1.id
        ), 0) AS value
FROM    table2 t2

Это будет работать иначе: 0 для имеющихся записей, value для отсутствующих записей:

SELECT  t2.id, t2.date,
        COALESCE(
        (
        SELECT  TOP 1 0
        FROM    table1 t1
        WHERE   t2.date BETWEEN t1.fromdate AND t1.todate
                AND t2.id = t1.id
        ), t2.value) AS value
FROM    table2 t2
person Quassnoi    schedule 08.10.2009
comment
Не могли бы вы опубликовать неверный результат? - person Quassnoi; 08.10.2009
comment
Отображается ошибка в SELECT TOP 1 t2.value FROM table1 t1 Поскольку у меня нет значения в table1, проверьте таблицу - person Gopal; 08.10.2009
comment
Это значение является коррелированным значением, взятым из внешнего подзапроса. Не могли бы вы опубликовать точное сообщение об ошибке? - person Quassnoi; 08.10.2009
comment
Понятно, но он работает наоборот, когда дата недоступна в таблице 1, теперь он показывает 0, если дата сравнивалась, то 0, иначе не 0, он должен работать только так. - person Gopal; 08.10.2009
comment
Просто замените 0 и t2.value в подзапросе. См. Сообщение об обновлении. - person Quassnoi; 08.10.2009
comment
И также это не было сравнением с идентификаторами. 0 отображается для всех идентификаторов - person Gopal; 08.10.2009
comment
@Gopal: исправлена ​​и id проблема. - person Quassnoi; 08.10.2009
comment
Это не сравнение с id. - person Gopal; 08.10.2009
comment
Запрос Проверьте это. ВЫБЕРИТЕ t2.personid, t2.cardeventdate, COALESCE ((ВЫБЕРИТЕ ТОП 1 t2.workedtime ИЗ MultiShiftDatabase.dbo.tb_leave t1 ГДЕ t2.cardeventdate МЕЖДУ t1.DATE И t1.DDATE1 И t2.personid = t1.id СОБИРАЙТЕ БАЗУ ДАННЫХ), 'ПО УМОЛЧАНИЮ) отсутствует ') Время работы AS из таблицы t2 - person Gopal; 08.10.2009