Как получить все записи в базе данных

#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() возвращает число, поэтому сравнение должно быть числом, а не строкой.