SQL 服务器 - 分组依据
SQL Server - Group By
输入数据
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 的串联。
我可以在没有游标和循环的情况下执行此操作吗?
我认为这应该有效。
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
输入数据
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 的串联。
我可以在没有游标和循环的情况下执行此操作吗?
我认为这应该有效。
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