【问题标题】:SUM DISTINCT based off a specific column?基于特定列的 SUM DISTINCT?
【发布时间】:2017-03-03 21:33:12
【问题描述】:

我只尝试对每个客户的余额求和一次。通常我会使用 SUM DISTINCT 表达式,但是,一列将其丢弃,并且该行不再是“不同的”。

例如:

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 的余额将被求和两次,因为他有不同的异常类型,实际上我只希望 SSRS 对每个客户求和一次。一种方法是对仅 DISTINCT 客户编号的“余额”求和。可能通过对客户编号进行分组?这在SSRS上可能吗?我宁愿不碰 SQL 数据集。

谢谢!

感谢任何输入。

【问题讨论】:

  • 好吧,如果您需要输出中的异常类型,则必须将其包含在 group by 中。这就是聚合的工作方式。如果不是,您希望看到哪个值?
  • SUM() OVER...
  • 肖恩,我已经包含了异常类型,这样我就可以看到每个异常类型的总数。但是,在进行总计时,我只想查看唯一客户编号的总和。
  • 您继续使用 SUM DISTINCT。我不认为它做你认为它做的事。
  • @StevenWhite Inconcievable(对不起,不得不说。)

标签: mysql sql-server reporting-services ssrs-2008


【解决方案1】:

你可以使用 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
*/
客户编号 客户名称 余额 -------------- ------------ ------------ CIF13443 保罗 125 CIF13452 瑞安 85 CIF13765 琳达 90

使用 windows 功能为重复的行选择一行:

;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

【讨论】:

  • 在这种情况下使用 UNION 强制进行不同的排序是没有意义的,并且会给下一个开发人员带来混乱和维护上的麻烦。如果最好的解决方案是在 SQL 中使用不同的排序,那就这么说吧。
  • @WesH 我又提出了一个问题。
猜你喜欢
  • 2017-10-26
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
相关资源
最近更新 更多