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