Сводная функция, возвращающая нулевые значения - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу показать все три строки в 1-й строке, поэтому я использовал сводку в запросе ** выходной рис прикреплен ** enter image description here

SELECT [Container Number],ReadTimee,Locationn,Trailer FROM             
(SELECT [Container Number],ReadTime,Location FROM #temp )as Tab1            
PIVOT            
(            
MAX(ReadTime) FOR Location IN (Trailer,ReadTimee,Locationn)) AS Tab2  

Но с помощью вышеприведенного запроса, возвращающего ноль . Выходной рис показан ниже enter image description here

Я хочу вывод Мне нравитсяэто

ReadTime                Location    Trailer Container Number           ReadTime                 Location    Trailer Container Number              ReadTime                  Location   Trailer  Container Number
2019-02-27 03:17:21.033 CUSTOM         1    ZIMU1374787,TRHU3437713   2019-02-27 06:10:35.470          ZERO        1    ZIMU1374787,TRHU3437713 2019-02-27 07:30:47.407             CFS            1    ZIMU1374787,TRHU3437713

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать метод MAX, чтобы получить необходимые столбцы:

SELECT
  MAX(CASE WHEN q.RowNumber = 1 THEN q.ReadTime ELSE NULL END) AS ReadTime
, MAX(CASE WHEN q.RowNumber = 1 THEN q.Location ELSE NULL END) AS Location
, MAX(CASE WHEN q.RowNumber = 1 THEN q.Trailer ELSE NULL END) AS Trailer
, MAX(CASE WHEN q.RowNumber = 1 THEN q.ContainerNumber ELSE NULL END) AS ContainerNumber
, MAX(CASE WHEN q.RowNumber = 2 THEN q.ReadTime ELSE NULL END) AS ReadTime
, MAX(CASE WHEN q.RowNumber = 2 THEN q.Location ELSE NULL END) AS Location
, MAX(CASE WHEN q.RowNumber = 2 THEN q.Trailer ELSE NULL END) AS Trailer
, MAX(CASE WHEN q.RowNumber = 2 THEN q.ContainerNumber ELSE NULL END) AS ContainerNumber
, MAX(CASE WHEN q.RowNumber = 3 THEN q.ReadTime ELSE NULL END) AS ReadTime
, MAX(CASE WHEN q.RowNumber = 3 THEN q.Location ELSE NULL END) AS Location
, MAX(CASE WHEN q.RowNumber = 3 THEN q.Trailer ELSE NULL END) AS Trailer
, MAX(CASE WHEN q.RowNumber = 3 THEN q.ContainerNumber ELSE NULL END) AS ContainerNumber
FROM
(
    SELECT 
    *
    , ROW_NUMBER() OVER(PARTITION BY T.Trailer ORDER BY T.Trailer) AS RowNumber
    FROM @Table AS T
)AS q

Позвольте мне показать пример:

DECLARE @Table TABLE
(
    ReadTime DATETIME,
    [Location] VARCHAR(50),
    Trailer INT,
    ContainerNumber VARCHAR(50)
)

INSERT INTO @Table
(
    ReadTime,
    Location,
    Trailer,
    ContainerNumber
)
VALUES
  (   '2019-02-23 12:22:35.490', 'CUSTOM', 1, 'ZIMU1' )
, (   '2019-02-24 12:22:35.490', 'ZERO', 1, 'ZIMU2' )
, (   '2019-02-25 12:22:35.490', 'CFS', 1, 'ZIMU3')

И использовать приведенный выше запрос, чтобы получить желаемый результат:

enter image description here

0 голосов
/ 28 февраля 2019

Попробуйте:

SELECT Trailer, [Container Number], [CUSTOM] = MAX(CASE WHEN Location = 'CUSTOM' THEN ReadTime ELSE NULL END),
    [ZERO] = MAX(CASE WHEN Location = 'ZERO' THEN ReadTime ELSE NULL END),
    [CFS] = MAX(CASE WHEN Location = 'CFS' THEN ReadTime ELSE NULL END)
FROM @tmp 
GROUP BY Trailer, [Container Number]

Приведенный выше запрос возвращает:

Trailer Container Number        CUSTOM                  ZERO                    CFS
1       ZIMU1374787,TRHU3437713 2019-02-27 03:17:21.033 2019-02-27 06:10:35.470 2019-02-27 07:30:47.407

Если мой ответ соответствует вашим потребностям, примите мой ответ.Не стесняйтесь, чтобы улучшить его для ваших дальнейших потребностей.

...