#sql #sql-server #select
#sql #sql-сервер #выберите
Вопрос:
Привет, я сделал этот запрос выбора. Это работает нормально, однако показывает только записи, в которых произошла мутация. Я хочу увидеть все reknr dbo.grtbk (с мутацией или без нее). результат в периодах должен быть сопоставлен с цифрами. Это означает, что если это сработает, мне нужно иметь 1085 строк, и не все строки имеют результат. Как я могу это сделать?
SELECT TOP (100) PERCENT dbo.grtbk.reknr, dbo.grtbk.oms25_0, SUM(CASE WHEN MONTH(ReportingDate) = '1' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [1], SUM(CASE WHEN MONTH(ReportingDate)
= '2' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [2], SUM(CASE WHEN MONTH(ReportingDate) = '3' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [3],
SUM(CASE WHEN MONTH(ReportingDate) = '4' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [4], SUM(CASE WHEN MONTH(ReportingDate) = '5' THEN (AmountDCDebit - AmountDCCredit)
ELSE 0 END) AS [5], SUM(CASE WHEN MONTH(ReportingDate) = '6' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [6], SUM(CASE WHEN MONTH(ReportingDate)
= '7' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [7], SUM(CASE WHEN MONTH(ReportingDate) = '8' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [8],
SUM(CASE WHEN MONTH(ReportingDate) = '9' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [9], SUM(CASE WHEN MONTH(ReportingDate) = '10' THEN (AmountDCDebit - AmountDCCredit)
ELSE 0 END) AS [10], SUM(CASE WHEN MONTH(ReportingDate) = '11' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [11], SUM(CASE WHEN MONTH(ReportingDate)
= '12' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [12]
FROM dbo.GeneralLedgerBalances INNER JOIN
dbo.grtbk ON dbo.GeneralLedgerBalances.GeneralLedger = dbo.grtbk.reknr
WHERE (YEAR(dbo.GeneralLedgerBalances.ReportingDate) = 2020)
GROUP BY YEAR(dbo.GeneralLedgerBalances.ReportingDate), dbo.grtbk.oms25_0, dbo.grtbk.reknr
Комментарии:
1. Вы используете MySQL или MS Access?
2. Вы, вероятно, хотите
LEFT JOIN
, а неINNER JOIN
3. Привет, ребята, я только что добавил ответ, можете ли вы проверить, все ли в порядке?
4. Хорошо изучите это — ВЕРХНИЙ (100) ПРОЦЕНТ не дает ничего полезного, и вам следует забыть, что вы когда-либо об этом узнавали. Если порядок строк важен для вашего результирующего набора, то запрос, который его генерирует, ДОЛЖЕН СОДЕРЖАТЬ предложение ORDER BY .
Ответ №1:
LEFT JOIN
Версия выглядит следующим образом:
SELECT g.reknr, g.oms25_0,
SUM(CASE WHEN MONTH(glb.ReportingDate) = 1
THEN glb.AmountDCDebit - glb.AmountDCCredit ELSE 0
END) AS [1],
SUM(CASE WHEN MONTH(glb.ReportingDate) = 2
THEN glb.AmountDCDebit - glb.AmountDCCredit ELSE 0
END) AS [2],
. . .
FROM dbo.grtbk g LEFT JOIN
dbo.GeneralLedgerBalances glb
ON glb.GeneralLedger = g.reknr AND
YEAR(glb.ReportingDate) = 2020
GROUP BY YEAR(glb.ReportingDate), g.oms25_0, g.reknr;
Примечания:
- Вы хотите сохранить все строки,
grtbk
чтобы это была первая таблица вFROM
. - Фильтрация во второй таблице должна быть в
ON
предложении, а не вWHERE
предложении. - Псевдонимы таблиц облегчают запись и чтение запроса.
- Укажите все ссылки на столбцы в запросе, чтобы вы (и другие) знали, из каких таблиц они взяты.
MONTH()
возвращает число, поэтому сравнение должно быть числом, а не строкой.