SQL Pivot не совсем верно - PullRequest
       12

SQL Pivot не совсем верно

0 голосов
/ 02 октября 2018

Может быть, я просто недостаточно проснулся ... Я знаю, что делал что-то подобное в прошлом, и когда я смотрю на другие ответы здесь, я думаю, что делаю то же самое, но не получаю ожидаемых результатов.

У меня есть этот запрос:

SELECT 
      tPM.mast_rel as Mast_Rel
    , row_Number() over(Partition by tPM.Mast_rel Order by tPM.Mast_rel) as CategoryCount
    ,  S.[RC_TRANS] as [Category]
    ,  SUM(P.[VAL]) as [Value]
FROM #caselist AS tPM
INNER JOIN [TIBURON].[PARSProperty] AS P ON tPM.[MAST_REL] = P.[MAST_REL]
--S.RC_KEY equals combination of P.CAT-P.ART when P.CAT ='Y' otherwise just P.CAT = RC_KEY
LEFT JOIN [TIBURON].[SSCTAB] AS S ON (CASE
        WHEN P.[CAT] = 'Y' THEN P.[CAT] + '-' + P.[ART]
        ELSE P.[CAT]
    END) = S.[RC_KEY] AND S.[RC_TYPE] = 'CP'
WHERE P.[P_INVL] != 'EVD' and S.[RC_TRANS] is not null
GROUP BY tPM.mast_rel, S.[RC_TRANS] 

, который дает мне следующие результаты: enter image description here

Я хочу повернуть их, чтобы получитьодин Mast_Rel с тремя столбцами категорий

select Mast_Rel,[1], [2], [3]
from
(

SELECT 
      tPM.mast_rel as Mast_Rel
    , row_Number() over(Partition by tPM.Mast_rel Order by tPM.Mast_rel) as CategoryCount
    ,  S.[RC_TRANS] as [Category]
    ,  SUM(P.[VAL]) as [Value]
FROM #caselist AS tPM
INNER JOIN [TIBURON].[PARSProperty] AS P ON tPM.[MAST_REL] = P.[MAST_REL]
--S.RC_KEY equals combination of P.CAT-P.ART when P.CAT ='Y' otherwise just P.CAT = RC_KEY
LEFT JOIN [TIBURON].[SSCTAB] AS S ON (CASE
        WHEN P.[CAT] = 'Y' THEN P.[CAT] + '-' + P.[ART]
        ELSE P.[CAT]
    END) = S.[RC_KEY] AND S.[RC_TYPE] = 'CP'
WHERE P.[P_INVL] != 'EVD' and S.[RC_TRANS] is not null
GROUP BY tPM.mast_rel, S.[RC_TRANS] 
)
src
pivot
(
max(Category) for CategoryCount in ([1], [2], [3])
) piv

order by 1;

, но вместо того, чтобы получить одну строку, я получаю каждый в отдельной строке:

enter image description here

Кроме того, мне нужно иметь «итого» для столбца «Значение» также в сводной области.Итак, в конечном итоге я хотел бы одну запись, которая показывает:

enter image description here

Может ли кто-нибудь помочь мне настроить мой запрос, чтобы получить нужные мне результаты?Спасибо!

Редактировать: Вот скрипт, который создаст данные и текущие результаты:

declare  @results table (Mast_Rel varchar(100), CategoryCount varchar(10), Category varchar(100) , [Value] varchar(100))

insert into @results (Mast_rel, CategoryCount, Category, [Value]) 
values

 ('1602030055590P2404','1','Money','80.00'),
('1602051033480P3481','1','Miscellaneous/other (None of the above)','1000.00'),
('1602051033480P3481','2','Personal accessories (incl serial jewelry)','5000.00'),
('1602051033480P3481','3','Radio, TV, and sound entertainment devices',''),
('1602070005106P2804','1','Miscellaneous/other (None of the above)',''),
('1602080020374P3352','1','Money','128.09'),
('1602080020374P3352','2','Radio, TV, and sound entertainment devices',''),
('1602132349110P5208','1','Money','160.00'),
('1602132349110P5208','2','Radio, TV, and sound entertainment devices',''),
('1602171004296P3848','1','Consumable Goods','21.73'),
('1602201425504P2876','1','Radio, TV, and sound entertainment devices',''),
('16022115223610P3282','1','Consumable Goods','60.00'),
('16022115223610P3282','2','Money','300.00'),
('16022115223610P3282','3','Narcotic Equipment/Paraphernalia','10.00'),
('1602250140284P2804','1','Money','165.00'),
('1602250140284P2804','2','Radio, TV, and sound entertainment devices',''),
('16022916203812P2702','1','Guns/Firearms',''),
('16022916203812P2702','2','Radio, TV, and sound entertainment devices','')


select Mast_Rel,[1], [2], [3]
from
(

SELECT 
     * from @results
)
src
pivot
(
max(Category) for CategoryCount in ([1], [2], [3])
) piv

order by 1;

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Вы сможете изменить исходный запрос, чтобы получить желаемый результат.Проблема заключается в GROUP BY и SUM() в нем.Поскольку вы группируете по S.[RC_TRANS] для SUM(), вы возвращаете несколько строк, что изменяет конечный результат вашего PIVOT.

Вы можете удалить GROUP BY во внутреннем подзапросе и использовать вместо него SUM() OVER().Если вы измените исходный запрос на следующий, вы получите желаемый результат:

select Mast_Rel,[1], [2], [3], [Value]
from
(
  SELECT 
      tPM.mast_rel as Mast_Rel
    , row_Number() over(Partition by tPM.Mast_rel Order by tPM.Mast_rel) as CategoryCount
    ,  S.[RC_TRANS] as [Category]
    -- change the following line
    ,  SUM(P.[VAL]) OVER(PARTITION BY tPM.Mast_rel)  as [Value]
  FROM #caselist AS tPM
  INNER JOIN [TIBURON].[PARSProperty] AS P ON tPM.[MAST_REL] = P.[MAST_REL]
  --S.RC_KEY equals combination of P.CAT-P.ART when P.CAT ='Y' otherwise just P.CAT = RC_KEY
  LEFT JOIN [TIBURON].[SSCTAB] AS S ON (CASE
          WHEN P.[CAT] = 'Y' THEN P.[CAT] + '-' + P.[ART]
          ELSE P.[CAT]
      END) = S.[RC_KEY] AND S.[RC_TYPE] = 'CP'
  WHERE P.[P_INVL] != 'EVD' and S.[RC_TRANS] is not null
)
src
pivot
(
  max(Category) for CategoryCount in ([1], [2], [3])
) piv
order by 1;

При переходе с SUM(P.[VAL]) с GROUP BY на SUM(P.[VAL]) OVER(PARTITION BY tPM.Mast_rel) вы получите общую сумму для каждого tPM.Mast_rel это то, что вы пытаетесь вернуть в окончательный набор результатов.SUM(P.[VAL]) OVER должен вычислять одно и то же значение для каждой строки в Mast_Rel, что не приведет к созданию нескольких строк в конечном наборе результатов.

0 голосов
/ 02 октября 2018

Вы можете обернуть его в другой GROUP BY

SELECT Mast_Rel, MAX([1]) AS [1], MAX([2]) AS [2], MAX([3]) AS [3]
FROM
(
    SELECT * 
    FROM @results
) src
PIVOT
(
    MAX(Category) FOR CategoryCount IN ([1], [2], [3])
) piv
GROUP BY Mast_Rel
ORDER BY Mast_Rel;
0 голосов
/ 02 октября 2018

Я бы сделал условную агрегацию:

select mast_rel, 
       max(case when categorycount = 1 then category end), 
       max(case when categorycount = 2 then category end), 
       max(case when categorycount = 3 then category end),
       sum(value)
from @results r
group by mast_rel;
0 голосов
/ 02 октября 2018

Не уверен, так как я не могу проверить это напрямую, но что произойдет, когда вы добавите max (Mast_Rel) к предложению pivot?

pivot (
    max(Mast_Rel), max(Category) for CategoryCount in ([1], [2], [3])
) piv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...