SQL-запрос для диапазона дат - PullRequest
2 голосов
/ 13 мая 2009

Давайте снова зададим вопрос ---

  table1{date, bID, sName, fID}
    {11/05,B1,A1,P1}
    {12/05,B2,A2,P2}
    {13/05,B1,A3,P1}
    {15/05,B3,A4,P1}
    {16/05,B1,A5,P2}
    {19/05,B1,A6,P2}

Это таблица, и данные, хранящиеся в таблице, также указаны ...

Теперь запрос, который я хочу, это: -

В зависимости от fId (скажем, выбран P1) должны отображаться данные из таблицы, скажем, от 11 / 05-17 / 05 (дата не должна быть пропущена). Полученные данные выглядят следующим образом: -

11/05,B1,A1
12/05,--,--
13/05,B1,A3
14/05,--,--
15/05,B3,A4
16/05,--,--
17/05,--,--

Отображаются данные, извлеченные для определенного FID (скажем, P1). Объяснение результата ...

1) отображались все данные за 11 / 05-17 / 05, где fId - P1, если в базе данных нет даты, то также должно отображаться нулевое значение для этой даты (т.е. даты 14/05 не было в базе данных, но все равно отображается с нулевым значением) ..

2) если fId для этой конкретной даты не является P1, то он также сохраняет нулевое значение в наборе результатов ..

Atlast данные извлекаются в наборе результатов ,, и обрабатываются далее ..

Итак, я хочу написать запрос для этой проблемы, возможно ли это ...

Ответы [ 2 ]

3 голосов
/ 13 мая 2009

Здесь нет кода, только мои мысли.

Вам необходимо создать временную таблицу с датами в диапазоне от начальной даты до конечной даты включительно. И затем left join table1 с этой временной таблицей в столбце date плюс добавление where fID = ?.

1 голос
/ 13 мая 2009

Как уже упоминалось в другом ответе, вам нужна таблица со всеми датами и LEFT JOIN.

Скажем, у вас есть эта таблица:

CREATE TABLE table1
{
    date    DATETIME
    bID     VARCHAR(10),
    sName   VARCHAR(10),
    fID     VARCHAR(10)
}

, а затем эта таблица дат:

CREATE TABLE dates
(
    dt      DATETIME
)

и в этой таблице вам нужно указать все даты для диапазона, который вы хотите отобразить. Обычно вы заполняете его на пару лет в обоих направлениях, но это ваше дело.

Примечание. Для простоты я не беспокоился о первичных ключах в обеих таблицах. Конечно, вы должны убедиться, что у вас есть первичный ключ, и в случае таблицы dates это может быть столбец dt.

Затем для отображения желаемых результатов:

SELECT
    dt,
    bID,
    sName
FROM
    dates
    LEFT JOIN table1 ON dt = date AND fld = 'P1'
ORDER BY
    dt

Обратите внимание, что выбор только P1 строк выполняется в критериях JOIN. Если вы добавите предложение WHERE, чтобы сделать то же самое, вы потеряете все даты, у которых нет данных.

...