Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL填充数据_Sql_Sql Server_Algorithm_Tsql - Fatal编程技术网

TSQL填充数据

TSQL填充数据,sql,sql-server,algorithm,tsql,Sql,Sql Server,Algorithm,Tsql,我需要找到一种方法,以特定的方式对一些数据进行分组 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 - 2018

我需要找到一种方法,以特定的方式对一些数据进行分组

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行分组,并将
设置为
201710
设置为
201803
。但我不能按号码分组,因为以后可能会再次更改

有什么想法吗

我唯一的想法是将FROM与下一行的FROM进行检查,如果数字匹配,则将其设置为上一行的FROM。然后我可以根据
id、number
FROM
进行分组,并将
MAX
取到
。但我真的不想用光标

下面是一个测试脚本:

DECLARE @Test AS table
(
    customerid int,
    Number     int,
    DateFrom   int,
    DateTo     int
);

INSERT INTO @Test
VALUES (1, 240, 201710, 201712),
       (1, 240, 201712, 201801),
       (1, 240, 201801, 201803),
       (1, 300, 201803, 201805),
       (1, 240, 201805, 999999);

SELECT t.customerid,
       t.Number,
       t.DateFrom,
       t.DateTo
FROM   @Test t;

SELECT   customerid,
         STUFF(
         (SELECT DISTINCT
                 ', ' + CONVERT(varchar(100), (t2.DateFrom)) + ' - ' + CONVERT(varchar(100), (t2.DateTo)) + ' : '
                 + CONVERT(varchar(100), (t2.Number))
          FROM   @Test t2
         FOR XML PATH('')),
         1,
         2,
         '') AS Text
FROM     @Test t
WHERE t.customerid = t2.customerid
GROUP BY t.customerid;
试试这个:

;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, 

看起来很棒!肯定能解决这个问题。谢谢不知何故,它在我的生产数据中不起作用……你知道它失败的可能原因吗?行号根本没有排序。我只是在你的cte前面有另一个cte,它提供data@Karsten93你说不工作是什么意思?你有错误吗?还是输出错误?显然,如果您的数据与您在此处发布的数据具有相同的结构,那么它不可能不起作用。因此,您的生产数据可能不同。输出错误。数据似乎还可以。我签出了,表中已经有一些数据了。我看到的唯一区别是,生产数据中有重复的数据,但我之前对它们进行了过滤。插入@testvalues(124001710201712),(124001201712201801),(124001201801201803),(13000201803,201805),(1240120180599999),(11175201611201709),(11175201709,201711),(11 ,175, 201711, 201712), (11 ,175, 201712, 201801), (11 ,175, 201801, 201802)