我的表格如下:
Supplier ReferenceID Description Total
------------------------------------------------------------
smiths BP657869510L Order 67543 42
smiths BP657869510L Order 67543B 42
smiths BP654669517L No. 5621 13
smiths BP654669517L No. 56211 13
corrigan 15:51 Order 23542 23
corrigan 15:51 Order 235422 23
williams 14015 Block B 19
williams 14015 Block B2 19
我想写一个T-SQL查询来返回每个供应商的交易清单,根据ReferenceID
列消除重复的条目。从表中可以看出,Description
值在具有相同ReferenceID
的两列中可能不同(由于数据输入错误)。在这种情况下,如果可能的话,我想返回其中一个Description
值(我不关心哪一个)。
所以我想根据上面的数据返回的结果是(我随机选择了Description
值 - 我没有关于哪一个被返回的偏好,只要它被绑定到原始表格中的ReferenceID
。)
Supplier ReferenceID Description Total
--------------------------------------------------------
smiths BP657869510L Order 67543 42
smiths BP654669517L No. 5621 13
corrigan 15:51 Order 23542 23
williams 14015 Block B 19
我意识到这很复杂,但任何建议都值得赞赏!
答案 0 :(得分:2)
您只需要GROUP BY ReferenceID
,如果其余内容是任意/相等的,您可以使用MAX
或MIN
:
SELECT Supplier = MIN(Supplier),
ReferenceID,
Description = MIN(Description),
Total = MIN(Total)
FROM dbo.Tablename
GROUP BY ReferenceID
答案 1 :(得分:0)
SELECT Supplier
,ReferenceID
,MAX(Description) [Description]
,SUM(TOTAL) [TOTAL] --or MIN/MAX/AVG etc...
FROM TABLE
GROUP BY Supplier
,ReferenceID
答案 2 :(得分:0)
如果你想在保持记录完整性的同时为每个ReferenceID拉一条记录,那么你可以像这样使用dense_rank()。
WITH Table_CTE (Supplier, ReferenceID, Description, Total, RefRank) AS
(
SELECT Supplier, ReferenceID, Description, Total,
DENSE_RANK() OVER(PARTITION BY ReferenceID ORDER BY Description) As RefRank
FROM Table
)
SELECT Supplier, ReferenceID, Description, Total
FROM Table_CTE
WHERE RefRank = 1
按照其他人的建议使用GROUP BY可能是一个更简单的解决方案。
答案 3 :(得分:0)
DECLARE @TableName TABLE
([Supplier] varchar(8), [ReferenceID] varchar(12), [Description] varchar(12), [Total] int)
;
INSERT INTO @TableName
([Supplier], [ReferenceID], [Description], [Total])
VALUES
('smiths', 'BP657869510L', 'Order 67543', 42),
('smiths', 'BP657869510L', 'Order 67543B', 42),
('smiths', 'BP654669517L', 'No. 5621', 13),
('smiths', 'BP654669517L', 'No. 56211', 13),
('corrigan', '15:51', 'Order 23542', 23),
('corrigan', '15:51', 'Order 235422', 23),
('williams', '14015', 'Block B', 19),
('williams', '14015', 'Block B2', 19)
;
;WITH CTE AS
(
Select distinct t.Supplier,tt.ReferenceID,t.[Description],Total
from @TableName t
INNER JOIN
(Select distinct MIN(Supplier)as r,ReferenceID,MIN([Description]) as k
From @TableName
GROUP BY ReferenceID )tt
ON tt.ReferenceID = t.ReferenceID
AND t.Supplier = tt.r
AND t.Description = tt.k
GROUP BY t.Supplier,t.[Description],tt.ReferenceID,t.Total
)
Select C.Supplier,C.ReferenceID,C.Description,SUM(C.Total) FROM CTE C
GROUP BY C.Supplier,C.ReferenceID,C.Description
ORDER BY C.Supplier