如何在一条SQL语句中使用SUM、LEFT JOIN、group by和order by

如何在一条SQL语句中使用SUM、LEFT JOIN、group by和order by,sql,sql-server,tsql,group-by,sum,Sql,Sql Server,Tsql,Group By,Sum,我正在尝试构造一个可以在ASP.NET代码中使用的查询,该查询从数据库中提取,然后将其导出到excel文件中。我的目标是让SQL在迭代到工作表之前完成大部分工作。这是我在使用sum和group by之前的代码 SELECT EOD_Rental_Fees.*, POSH5_Prod_CoreBankingDetails.description as TotalFeeAmount) FROM EOD_Rental_Fees LEFT JOIN POSH5_Prod_CoreBankingDetai

我正在尝试构造一个可以在ASP.NET代码中使用的查询,该查询从数据库中提取,然后将其导出到excel文件中。我的目标是让SQL在迭代到工作表之前完成大部分工作。这是我在使用sum和group by之前的代码

SELECT EOD_Rental_Fees.*, POSH5_Prod_CoreBankingDetails.description as TotalFeeAmount)
FROM EOD_Rental_Fees
LEFT JOIN POSH5_Prod_CoreBankingDetails ON EOD_Rental_Fees.CoreBankingID = POSH5_Prod_CoreBankingDetails.ID 
WHERE DateProcessed >= '2018-07-01 00:00:00.000'
AND DateProcessed <= '2018-08-30 00:00:00:000'          
ORDER BY description, DateProcessed;
选择EOD_租赁费。*,POSH5_Prod_corebanking details.description作为总费用)
来自EOD_租赁费
LEFT JOIN POSH5_Prod_CoreBankingDetails ON EOD_Rental_Fees.CoreBankingID=POSH5_Prod_CoreBankingDetails.ID
其中DateProcessed>=“2018-07-01 00:00:00.000”
日期处理='2018-07-01 00:00:00.000'

DateProcessed下面是如何使用
分组汇总来完成此操作的:

Select
    DESCRIPTION
    , currency
    , DateProcessed 
    SUM (EOD_Rental_Fees.TotalFee)
from
    EOD_Rental_Fees
LEFT JOIN POSH5_Prod_CoreBankingDetails 
    ON EOD_Rental_Fees.CoreBankingID = POSH5_Prod_CoreBankingDetails.ID
WHERE
    DateProcessed >= '2018-07-01 00:00:00.000'
    AND DateProcessed <= '2018-08-30 00:00:00:000'
GROUP BY ROLLUP (DESCRIPTION, currency, DateProcessed)
Order By
    description,DateProcessed;
选择
描述
,货币
,已处理日期
总额(EOD_租赁费。总费用)
从…起
爆炸品租赁费
左连接位置H5_产品_CoreBankingDetails
关于EOD_租赁费。CoreBankingID=POSH5_产品_CoreBankingDetails.ID
哪里
已处理日期>='2018-07-01 00:00:00.000'

而DateProcessed你不断地增加问题的难度,这让你很难回答。在最新的图像中,您显示的是一个报告,而不是一个查询结果,因此我将忽略小计,并为您的表示层提供一些需要处理的内容

“从我所看到的来看,我的查询看起来很好”对不起,它不好,因为它会产生SQL错误。该错误实际上告诉您,如果要使用group by,必须指定要按哪些列进行分组。您的查询不会这样做

为了避免这个错误,每个“非聚合”列都需要在GROUPBY子句中像这样拼写出来(注意,不能使用*进行此操作)

注:

  • 使用表别名简化查询
  • 连接表时,请在所有列引用中包含表别名
  • 我巧妙地改变了日期范围的工作方式,总是使用>=和<的组合,上限是“第二天”。使用这种方法,您可以覆盖所有既有日期又有时间的数据行

  • 请为这两个表添加示例数据,并向我们显示基于该示例数据的准确输出。有必要知道您使用的数据库以及版本,所选标记都不能充分缩小解决方案选项的范围。e、 g.MySQL 8+将与MySQL不同。抱歉,我已将sql server添加到标记中。谢谢显示的金额(EOD_租金。TotalFee)是多少?按货币分组没有意义请将代码、数据和错误发布为格式化文本,而不是图像。嘿,非常感谢!我不断地添加,以提供更多的细节,使人们更容易理解我在寻找什么。对不起!请注意where子句中日期范围的更改。在处理日期时间数据时,很容易出错,这可能会排除最后一天的持续时间。
    Select
        DESCRIPTION
        , currency
        , DateProcessed 
        SUM (EOD_Rental_Fees.TotalFee)
    from
        EOD_Rental_Fees
    LEFT JOIN POSH5_Prod_CoreBankingDetails 
        ON EOD_Rental_Fees.CoreBankingID = POSH5_Prod_CoreBankingDetails.ID
    WHERE
        DateProcessed >= '2018-07-01 00:00:00.000'
        AND DateProcessed <= '2018-08-30 00:00:00:000'
    GROUP BY ROLLUP (DESCRIPTION, currency, DateProcessed)
    Order By
        description,DateProcessed;
    
    SELECT 
          rf.id
        , rf.year
        , rf.month
        , rf.DateProcessed
        , rf.CoreBankingID
        , rf.MerchantRecordID
        , rf.DeployedDate 
        , rf.TerminalRecordID
        , rf.DeployedDate
        , rf.RecoveredDate
        , rf.MonthlyFee
        , rf.IsProRated
        , rf.DaysActive
        , rf.TotalFee
        , rf.IsPinPad
        , rf.Currency
        , det.description
        , sum(rf.TotalFee) as TotalFeeAmount
    FROM EOD_Rental_Fees AS rf
    LEFT JOIN POSH5_Prod_CoreBankingDetails as det ON rf.CoreBankingID = det.ID
    WHERE rf.DateProcessed >= '2018-07-01 00:00:00.000'
       AND rf.DateProcessed < '2018-09-01 00:00:00:000'
    GROUP BY
          rf.id
        , rf.year
        , rf.month
        , rf.DateProcessed
        , rf.CoreBankingID
        , rf.MerchantRecordID
        , rf.DeployedDate 
        , rf.TerminalRecordID
        , rf.DeployedDate
        , rf.RecoveredDate
        , rf.MonthlyFee
        , rf.IsProRated
        , rf.DaysActive
        , rf.TotalFee
        , rf.IsPinPad
        , rf.Currency
        , det.description
    ORDER BY
          det.description
        , rf.DateProcessed
    
    SELECT 
          rf.id
        , rf.year
        , rf.month
        , rf.DateProcessed
        , rf.CoreBankingID
        , rf.MerchantRecordID
        , rf.DeployedDate 
        , rf.TerminalRecordID
        , rf.DeployedDate
        , rf.RecoveredDate
        , rf.MonthlyFee
        , rf.IsProRated
        , rf.DaysActive
        , rf.TotalFee
        , rf.IsPinPad
        , rf.Currency
        , det.description
        , sum(rf.TotalFee) over(partition by rf.CoreBankingID, Currency) as TotalFeeAmount
    FROM EOD_Rental_Fees AS rf
    LEFT JOIN POSH5_Prod_CoreBankingDetails as det ON rf.CoreBankingID = det.ID
    WHERE rf.DateProcessed >= '2018-07-01 00:00:00.000'
       AND rf.DateProcessed < '2018-09-01 00:00:00:000'
    ORDER BY
          det.description
        , rf.DateProcessed