如何压缩查询结果?

时间:2019-05-02 10:14:27

标签: sql-server tsql

我有一个包含两列的表:CODE和LINE NUMBER: 201 1 201 2 202 2 203 1 203 3 204 205 1 205 2 205 4 等等等等 与我写的查询,我得到这个网格: 201 1 2-- 202-2-- 203 1-3- 204---- 205 1 2-4 这是我的查询(SQL Server): 转换总和(数字) SELECT codice 来自塔贝拉 GROUP BY鳕鱼 PIVOT numriga In(1,2,3,4,5); 可以用sql获取代替此网格吗? (已删除空列) 201 1 2 202 2 203 1 3 204 205 1 2 4 谢谢

1 个答案:

答案 0 :(得分:3)

您可以首先使用ROW_NUMBER()来获取numriga中每个codice的运行编号,然后使用PIVOT条件聚合

样机表(请下次自行创建)

DECLARE @tbl TABLE(codice INT, numriga INT)
INSERT INTO @tbl VALUES
 (201,1)
,(201,2)
,(202,2)
,(203,1)
,(203,3)
,(204,NULL)
,(205,1)
,(205,2)
,(205,4);

需要CTE将运行编号应用于每个数字

WITH cte AS
(
    SELECT *
          ,ROW_NUMBER() OVER(PARTITION BY t.codice ORDER BY t.numriga) AS numrigaIndex
    FROM @tbl t
)
SELECT t.codice
      ,MAX(CASE WHEN t.numrigaIndex=1 THEN numriga END) AS [1]
      ,MAX(CASE WHEN t.numrigaIndex=2 THEN numriga END) AS [2]
      ,MAX(CASE WHEN t.numrigaIndex=3 THEN numriga END) AS [3]
      ,MAX(CASE WHEN t.numrigaIndex=4 THEN numriga END) AS [4]
FROM cte t
GROUP BY t.codice;

您可以根据需要添加任意多行。

结果

codice  1       2       3       4
------------------------------------
201     1       2       NULL    NULL
202     2       NULL    NULL    NULL
203     1       3       NULL    NULL
204     NULL    NULL    NULL    NULL
205     1       2       4       NULL