如何总结"情况"内连接后的子句没有重复

时间:2017-01-25 09:12:37

标签: sql sql-server tsql

我是Stackoverflow的新成员(我也是编码sql的新成员)如果我对我的问题有任何错误,请告诉我:)

我试图在SUM条款中获得CASE WHEN金额。 这是我的表

tableA

UserID  transid  Brand  Amount  
UserA   109974   MIX    960.00  --BrandMIX=A & B   
UserB   109975   B      894.00  
UserC   109976   C      350.00  
UserC   109977   MIX    300.00  --BrandMIX=C & D 

tableB

Row transid Brand  
1   109974  A   
2   109974  B   
3   109975  B   
4   109976  C   
5   109977  C  
6   109977  D   

我在a.soid = b.soid上尝试了内连接表a和表b 当我对它进行总结时,由于表b中的transid重复,结果是错误的。 这是我的编码。

 SELECT UserID
,CASE WHEN COUNT(DISTINCT(b.transid )) <> 0 THEN COUNT(DISTINCT(b.transid ))
    ELSE NULL END) AS 'Frequency'
,SUM(Amount) as 'TotalAmount'
,YEAR(transdatetime) AS 'Year'
,SUM (CASE [Brand] WHEN 'AA' THEN 1 ELSE 0 END) AS [BrandA] 
,SUM (CASE [Brand] WHEN 'BB' THEN 1 ELSE 0 END) AS [BrandB] 
,SUM (CASE [Brand] WHEN 'CC' THEN 1 ELSE 0 END) AS [BrandC] 
,SUM (CASE [Brand] WHEN 'DD' THEN 1 ELSE 0 END) AS [BrandD] 
,SUM (CASE [Brand] WHEN 'ZZ' THEN 1 ELSE 0 END) AS [BrandZ] 
FROM tableA a
INNER tableB b ON a.transid = b.transid
WHERE  is_paid = 'N'
GROUP BY UserID, YEAR(transdatetime)

我得到的结果
enter image description here

我想要的结果
 enter image description here

我在表格B中添加了ROW_NUMBER(),我想SUM(金额)WHERE MIN(ROW_NUMBER),这是不可能的? 请指教,谢谢。

1 个答案:

答案 0 :(得分:1)

根据你的row_number,即(tableB的行列),我修改了你的查询以获取min(行)值。请尝试这个...如果这不起作用,请发布完整的表格结构。

SELECT UserID
,CASE WHEN COUNT(DISTINCT(b.transid )) <> 0 THEN COUNT(DISTINCT(b.transid ))
    ELSE NULL END AS 'Frequency'
,SUM(Amount) as 'TotalAmount'
,YEAR(transdatetime) AS 'Year'
,SUM (CASE [Brand] WHEN 'AA' THEN 1 ELSE 0 END) AS [BrandA] 
,SUM (CASE [Brand] WHEN 'BB' THEN 1 ELSE 0 END) AS [BrandB] 
,SUM (CASE [Brand] WHEN 'CC' THEN 1 ELSE 0 END) AS [BrandC] 
,SUM (CASE [Brand] WHEN 'DD' THEN 1 ELSE 0 END) AS [BrandD] 
,SUM (CASE [Brand] WHEN 'ZZ' THEN 1 ELSE 0 END) AS [BrandZ] 
FROM tableA a
INNER JOIN tableB b ON a.transid = b.transid
WHERE  is_paid = 'N' AND b.row in (select min(row) from tableB group by transid)
GROUP BY UserID, YEAR(transdatetime)