【问题标题】:How to get all records in database如何获取数据库中的所有记录
【发布时间】:2020-10-05 07:51:04
【问题描述】:

您好,我做了这个选择查询。这很好用,但是它只显示发生突变的记录。我想查看 dbo.grtbk 的所有 reknr(有或没有突变)。期间的结果必须与数字相匹配。这意味着如果它有效,我需要有 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

【问题讨论】:

  • 您使用的是 MySQL 还是 MS Access?
  • 你可能想要LEFT JOIN,而不是INNER JOIN
  • 大家好,我刚刚添加了一个答案,您可以检查它是否正常吗?
  • 好好学习 - TOP (100) PERCENT 没有任何用处,您应该忘记您曾经了解过它。如果行的顺序对您的结果集很重要,那么生成它的查询必须有一个 ORDER BY 子句。

标签: sql sql-server select


【解决方案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 中的第一个表。
  • second 表的过滤需要在ON 子句中,而不是在WHERE 子句中。
  • 表别名使查询更易于编写和阅读。
  • 限定查询中的所有列引用,以便您(和其他人)知道它们来自哪些表。
  • MONTH() 返回一个 number,所以比较应该是一个 number 而不是 string

【讨论】:

    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多