TSQL资料数据

时间:2018-08-31 09:30:33

标签: sql sql-server algorithm tsql

我需要找到一种以特定方式Group By来存储某些数据的方法。

id  Number  FROM    TO
1   240     201710  201712
1   240     201712  201801
1   240     201801  201803
1   300     201803  201805
1   240     201805  999999

我需要以这种方式将它们分组:

id  TEXT
1   201710 - 201803: 240, 201803 - 20180: 300, 201805 - 999999: 240

我的问题是进行正确的分组。它必须将第1-3行分组,并将FROM设置为201710,并将TO设置为201803。但是我不能按数字分组,因为它以后可能会再次更改。

有什么想法吗?

我唯一的想法是检查FROM与下一行的FROM,并将其设置为前一个FROM(如果数字匹配)。然后我可以按id, numberFROM分组,并取MAX的{​​{1}}。但是我真的不想使用游标。

这里有一个抄本:

TO

1 个答案:

答案 0 :(得分:5)

尝试一下:

;WITH cte AS (
    SELECT t.customerid,
           t.Number,
           t.DateFrom,
           t.DateTo,
           ROW_NUMBER() over (order by datefrom) - ROW_NUMBER() over (partition by number order by datefrom) grpCol
    FROM   @Test t
), cte2 AS (
    SELECT customerid, 
           cast(MIN(datefrom) as varchar(10)) + ' - ' + cast(MAX(dateto) as varchar(10)) + ': ' + cast(number as varchar(10)) [text],
           MIN(datefrom) datefrom
    FROM cte c
    group by customerid, number, grpCol
)

SELECT customerid, 
       (select [text] + ', ' from cte2 where customerid = c.customerid order by datefrom for xml path('')) [text]
FROM cte2 c
GROUP BY customerid

输出:

customerid | text
1          | 201710 - 201803: 240, 201803 - 201805: 300, 201805 - 999999: 240,