Вопрос

Давайте сформулируем вопрос еще раз---

  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, то он также сохраняет нулевое значение в результирующем наборе..

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

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

Это было полезно?

Решение

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

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

Другие советы

Как упоминается в другом ответе здесь, таблица со всеми датами в ней и 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 предложение чтобы сделать то же самое, вы потеряете все даты, в которых нет данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top