如何在一条SQL语句中使用SUM、LEFT JOIN、group by和order by
我正在尝试构造一个可以在ASP.NET代码中使用的查询,该查询从数据库中提取,然后将其导出到excel文件中。我的目标是让SQL在迭代到工作表之前完成大部分工作。这是我在使用sum和group 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
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