Как сжать результат запроса? - PullRequest
2 голосов
/ 02 мая 2019

У меня есть таблица с двумя столбцами, КОД и НОМЕР ЛИНИИ:

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):

TRANSFORM sum(numriga)
SELECT codice
FROM tabella
GROUP BY codice
PIVOT numriga In (1,2,3,4,5); 

Можно ли с помощью sql получить вместо этой сетки? (пустой столбец удален)

201 1 2 
202 2 
203 1 3 
204 
205 1 2 4

Thankyou

1 Ответ

3 голосов
/ 02 мая 2019

Вы можете сначала использовать ROW_NUMBER(), чтобы получить порядковый номер для numriga в пределах codice, а затем использовать PIVOT или условное агрегирование с этим:

A таблица макетов (пожалуйста, создайте ее самостоятельно в следующий раз)

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...