按 Y 分组的每个 X 的值总和

Sum of value per X grouped by Y

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

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

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

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

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

首先根据 3 columns.Then 从您的临时工中获取 DISTINCT 值 columns.Then 基于 GROUP BY Customer

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

使用行号

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

通过内联查询从 table 获取不同记录并命名为 "Inline",然后从 "Inline" 获得 select 客户和总折扣 Like

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