【问题标题】:Sum of value per X grouped by Y按 Y 分组的每个 X 的值总和
【发布时间】:2017-03-30 17:44:35
【问题描述】:
declare @table table (Customer  char(1), Transaction char(3), Discount float);
insert into @table values 
('A', '001', '10.1'),
('A', '001', '10.1'),
('A', '002', '20.2'),
('B', '003', '30.3'),
('B', '004', '40.4')

我正在尝试做这样的事情:

SELECT Customer, (SELECT SUM(Discount) WHERE Transaction IS DISTINCT)
FROM @table
GROUP BY Customer

结果应该是这样的:

Customer    Total Discount
--------------------------
A                   30.3       
B                   70.7

所以基本上我需要为每个客户的每笔交易提供所有折扣,因为它们有时会在我的数据中重复。

【问题讨论】:

  • 如果他们有相同的客户和交易但不同的折扣会发生什么?或者那不会发生?
  • @BennjoeMordeno 目前我在数据中看不到这一点。我认为那可能是数据错误。

标签: sql sql-server tableau-api


【解决方案1】:

您可以使用子查询仅获取所有不同的行;

SELECT Customer, SUM(Discount) as Total_Discount FROM 
(
 SELECT DISTINCT Customer, Transaction, Discount FROM @table
) x
group by Customer

回答您的问题;如果出现同一客户,同一笔交易,但折扣不同的情况,您必须决定是完全将其视为不同的交易,还是只获得最高折扣或最低折扣。

为了获得最高的折扣,

SELECT Customer, SUM(Discount) as Total_Discount FROM 
(
 SELECT Customer, Transaction, MAX(Discount) as Discount FROM @table
 GROUP BY Customer, Transaction
) x
group by Customer

为了获得最低的折扣

SELECT Customer, SUM(Discount) as Total_Discount FROM 
(
 SELECT Customer, Transaction, MIN(Discount) as Discount FROM @table
 GROUP BY Customer, Transaction
) x
group by Customer

如果您要将其视为完全不同的交易(这意味着它也将被添加到总数中);无需进一步更改代码。

【讨论】:

  • 谢谢 Bennjoe!那很完美。假设我有相同的客户和交易但不同的折扣,我也让它添加不同的金额,代码会改变多少?再次感谢!
【解决方案2】:

首先根据 3 列从临时表中获取 DISTINCT 值。然后根据 GROUP BY Customer 求和折扣值

  SELECT A.Customer, SUM(A.Discount) as Total_Discount 
  FROM 
   (
     SELECT DISTINCT Customer, Transaction, Discount FROM @table
   ) A
  GROUP BY A.Customer

【讨论】:

    【解决方案3】:

    使用行号

    SELECT Customer
        ,sum(Discount) as Total_Discount 
    FROM (
        SELECT Customer
            ,[Transaction]
            ,Discount
            ,row_number() OVER (
                PARTITION BY Customer
                ,[Transaction] ORDER BY Discount
                ) AS rn
        FROM @table
        ) t
    WHERE rn = 1
    GROUP BY Customer
    

    【讨论】:

      【解决方案4】:

      通过内联查询从表中获取不同的记录并命名为“内联”,然后从“内联”喜欢中选择客户和总和折扣

      SELECT Inline.Customer,
      SUM(Inline.[Discount]) FROM
      (SELECT DISTINCT Customer,[Discount] FROM @table)   Inline
        GROUP BY Inline.Customer
      

      【讨论】:

        猜你喜欢
        • 2022-08-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多