SQL Server - 分组依据

时间:2015-02-19 18:53:09

标签: sql sql-server sql-server-2008

输入数据

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的连接。

我可以在没有游标和循环的情况下执行此操作。

1 个答案:

答案 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