输入数据
ID Value1 Value2 Value3 Value4
100 10 ABC 15:00 4551
100 20 DEF 18:00 4556
103 30 XYZ 13:00 5667
103 40 TTT 11:00 4789
期望的结果
ID Result1 Result2 Result3 Result4
100 10 ABC 15:00 4551, 4556
103 40 TTT 11:00 5667, 4789
我想按ID对输入数据进行分组。结果1,结果2和结果3列应为具有最小值3的行中的值。结果4应该是值4的连接。
我可以在没有游标和循环的情况下执行此操作。
答案 0 :(得分:1)
这应该是我认为的。
tmpTable
仅用于示例数据。
partition by
用于最小值。
但我认为XML部分可能更好。
WITH tmpTable (ID, Value1, Value2, Value3, Value4) AS
(
SELECT 100, 10, 'ABC', '15:00', 4551 UNION
SELECT 100, 20, 'DEF', '18:00', 4556 UNION
SELECT 103, 30, 'XYZ', '13:00', 5667 UNION
SELECT 103, 40, 'TTT', '11:00', 4789
)
SELECT
ID, Value1 AS Result1, Value2 AS Result2, Value3 AS Result3,
Result4 = SubString((SELECT ', ' + sub.Value4
FROM (SELECT Top 100000 Convert(VARCHAR(255), tmpTable.Value4) AS Value4
FROM tmpTable
WHERE tmpTable.ID = data.ID
ORDER BY tmpTable.Value4 ASC) sub
FOR XML path('')), 3, 1000000)
FROM (
SELECT *, sort = Row_Number() Over (PARTITION BY ID ORDER BY Value3 ASC)
FROM tmpTable
) data
WHERE sort = 1
结果:
ID Result1 Result2 Result3 Result4
100 10 ABC 15:00 4551, 4556
103 40 TTT 11:00 4789, 5667