Mysql 根据特定列求和?
我试图只对每个客户的余额求和一次。通常情况下,我会使用一个SUM DISTINCT表达式,但是,有一列将其丢弃,而该行不再是“DISTINCT” 例如:Mysql 根据特定列求和?,mysql,sql-server,reporting-services,ssrs-2008,Mysql,Sql Server,Reporting Services,Ssrs 2008,我试图只对每个客户的余额求和一次。通常情况下,我会使用一个SUM DISTINCT表达式,但是,有一列将其丢弃,而该行不再是“DISTINCT” 例如: Customer Number - Customer Name - Exception Type - Balance CIF13443 - Paul - 1 - 125 CIF13452 - Ryan - 2 - 85 CIF13
Customer Number - Customer Name - Exception Type - Balance
CIF13443 - Paul - 1 - 125
CIF13452 - Ryan - 2 - 85
CIF13443 - Paul - 3 - 125
CIF13765 - Linda - 1 - 90
在这种情况下,如果我使用SUM DISTINCT,Paul的余额将被求和两次,因为他有一个不同的异常类型,实际上我只希望SSR对每个客户求和一次。一种方法是只对不同客户编号的“余额”求和。可能通过分组客户编号?这在SSR上可能吗?我宁愿不接触SQL数据集
谢谢
欢迎您的任何输入。您可以使用union清除重复行: 查询1(使用联合):
;WITH testdata(CustomerNumber,CustomerName,ExceptionType,Balance)AS(
SELECT 'CIF13443','Paul','1',125 UNION all
SELECT 'CIF13452','Ryan ','2',85 UNION all
SELECT 'CIF13443','Paul','3',125 UNION all
SELECT 'CIF13765','Linda','1',90
)
SELECT CustomerNumber,CustomerName,Balance FROM testdata UNION SELECT NULL,NULL,NULL WHERE 1!=1
/*
SELECT CustomerNumber,CustomerName,SUM(t.Balance) AS total_balance
FROM (
SELECT CustomerNumber,CustomerName,Balance FROM testdata UNION SELECT NULL,NULL,NULL
) AS t WHERE CustomerNumber IS NOT null
GROUP BY CustomerNumber,CustomerName
*/
;WITH testdata(CustomerNumber,CustomerName,ExceptionType,Balance)AS(
SELECT 'CIF13443','Paul','1',125 UNION all
SELECT 'CIF13452','Ryan ','2',85 UNION all
SELECT 'CIF13443','Paul','3',125 UNION all
SELECT 'CIF13765','Linda','1',90
)
如果在输出中需要异常类型,则必须将其包含在GROUPBY中。这就是聚合的工作原理。如果没有,您希望看到哪个值?
SUM()OVER…
Sean,我将包含异常类型,以便可以看到每个异常类型的总数。但是,当进行总计时,我只希望看到唯一客户编号的总和。您继续使用SUM DISTINCT。“我不认为它能做你认为它能做的事情。”StevenWhite Inconcievable(抱歉,不得不这么说。)在这种情况下,使用UNION强制进行不同的排序是毫无意义的,并且会给下一个开发人员带来混乱和维护上的麻烦。如果最好的解决方案是在SQL中使用不同的排序,那么就这样说。@WesH我给出了另一个查询。
;WITH testdata(CustomerNumber,CustomerName,ExceptionType,Balance)AS(
SELECT 'CIF13443','Paul','1',125 UNION all
SELECT 'CIF13452','Ryan ','2',85 UNION all
SELECT 'CIF13443','Paul','3',125 UNION all
SELECT 'CIF13765','Linda','1',90
SELECT CustomerNumber,CustomerName,SUM(t.Balance) AS total_balance
FROM (
SELECT CustomerNumber,CustomerName,Balance,ROW_NUMBER()OVER(PARTITION BY CustomerNumber,CustomerName,Balance ORDER BY testdata.ExceptionType) seq FROM testdata
) AS t WHERE t.seq=1
GROUP BY CustomerNumber,CustomerName