Ambarish Kesavarapu Ответов: 2

Динамический свод на двух столбцах в SQL server


Привет,

Я хотел сделать сводку по двум столбцам в таблице sql server, которая должна будет генерировать динамические столбцы. Я попробовал сделать это следующим образом

Что я уже пробовал:

CREATE TABLE [dbo].[Test](
	[Writer] [nvarchar](300) NULL,
	[PackageID] [nvarchar](300) NULL,
	[PubType] [nvarchar](300) NULL,
	[RFT] [int] NULL,
)

INSERT INTO Test 
VALUES
('Ajeeth Kumar','723','ABC',1),
('Ajeeth Kumar','724','ABC',1),
('Ajeeth Kumar','725','ABC',1),
('Ajeeth Kumar','726','DEF',1),
('Ajeeth Kumar','727','DEF',0),
('Ajeeth Kumar','728','DEF',0)

SELECT * FROM Test

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(PubType)
            FROM Test 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') ,1,1,'')

PRINT @cols 

SET @query = 'SELECT Writer, ' + @cols + ' from 
              (
                SELECT	Writer						
						,PackageID
						,PubType						
                FROM Test
              )x             
              PIVOT 
              (
                COUNT(PackageID)
                for PubType in (' + @cols + ')
              )p              
              WHERE Writer IS NOT NULL'

    
EXECUTE (@query)


Это дает мне выход, так как я поворачивался только с колонкой PubType

Writer	        ABC	DEF
Ajeeth Kumar	3	3


Но мне нужно, чтобы вывод также был развернут с помощью столбца PubType и RFT, чтобы мой вывод выглядел так

Writer	        ABC	DEF   0   1
Ajeeth Kumar	3	3     2   4


Любая помощь в этом вопросе будет оценена по достоинству. Спасибо!!

FranzBe

Просто комментарий: Я проголосовал за ваш вопрос, потому что вы предоставили настройку (таблицу и данные), чтобы быстро поиграть с заданной темой. То, что я часто пропускаю в других вопросах, которые я читаю.

2 Ответов

Рейтинг:
14

FranzBe

Рассматривали ли вы делать что-то вроде этого:

SELECT
  a.Writer
  ,SUM(a.ABC)  AS ABC
  ,SUM(a.DEF)  AS DEF
  ,SUM(a.RFT_0)  AS RFT_0
  ,SUM(a.RFT_1)  AS RFT_1
FROM
(
SELECT  Writer
  ,CASE WHEN PubType = 'ABC' THEN 1 ELSE 0 END AS ABC
  ,CASE WHEN PubType = 'DEF' THEN 1 ELSE 0 END AS DEF
  ,CASE WHEN RFT = 0 THEN 1 ELSE 0 END AS RFT_0
  ,CASE WHEN RFT = 1 THEN 1 ELSE 0 END AS RFT_1
 FROM TEST
 ) a
GROUP BY
 Writer


Это даст вам необходимый результат и кажется мне более легким, чем подход pivot. Генерировать этот динамический запрос, например, в c# , было бы не так уж сложно (хотя я не знаю, как это сделать в raw sql)


Maciej Los

5ед!