Переформатирование вывода SQL - PullRequest
0 голосов
/ 14 июня 2019

У меня есть данные, которые выглядят так:

Name  XX YY
alpha 10 77
beta  10 90
alpha 20 72
beta  20 91
alpha 30 75
beta  30 94
alpha 40 76
beta  40 95

Если я использую

select * from scores order by Name, XX

, я получу

Name  XX YY
alpha 10 77
alpha 20 72
alpha 30 75
alpha 40 76
beta  10 90
beta  20 91
beta  30 94
beta  40 95

На данный момент яизвлечение данных в этой форме и использование некоторого C-кода для его форматирования, например

Name   xx=10  xx=20  xx=30  xx=40
alpha  77     72     75     76
beta   90     91     94     95

Предполагая, что всегда будут записи по 10, 20, 30, 40 для каждого имени, это возможно в SQLбез создания новой таблицы, как в Переформатирование столбцов таблицы SQL

Ответы [ 3 ]

3 голосов
/ 14 июня 2019

Вам нужно использовать PIVOT, чтобы получить желаемые результаты.Перед использованием PIVOT необходимо внести некоторые изменения в значение в столбце XX, чтобы итоговый вывод столбца мог соответствовать вашим ожиданиям.достигается с помощью этого следующего запроса-

SELECT Name,
[10] AS [XX=10],
[20] AS [XX=20],
[30] AS [XX=30],
[40] AS [XX=40]
FROM
(
    SELECT Name, XX,YY 
    FROM your_table
)AS P
PIVOT(
    SUM(YY)
    FOR XX IN ([10],[20],[30],[40])
) PP
1 голос
/ 14 июня 2019

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

CREATE TABLE #table1 (Name varchar(100), XX INT, YY INT)

INSERT INTO #table1 VALUES
('alpha',10,77),
('beta',10,90),
('alpha',20,72),
('beta',20,91),
('alpha',30,75),
('beta',30,94),
('alpha',40,76),
('beta',40,95)

DECLARE @pvt NVARCHAR(MAX) = '';
DECLARE @dynamicCol NVARCHAR(MAX) = '';

SELECT @pvt +=  ', ' +QUOTENAME([XX]) FROM #table1 GROUP BY [XX];
SELECT @dynamicCol +=  ', ' +QUOTENAME([XX]) + ' AS ' + QUOTENAME('XX=' + CAST([XX] AS VARCHAR(25))) FROM #table1 GROUP BY [XX];
SET @pvt = STUFF(@pvt,1,1,'')
SET @dynamicCol = STUFF(@dynamicCol,1,1,'')

EXEC ('
SELECT [Name],' + @dynamicCol+'
FROM #table1 a
PIVOT 
(
  SUM([YY])
  FOR [XX] IN ('+ @pvt+')
) PIV');

Результат, как показано ниже,

Name    XX=10   XX=20   XX=30   XX=40
alpha   77      72      75      76
beta    90      91      94      95
0 голосов
/ 14 июня 2019

Другое решение с кейсом

SELECT Name
  ,SUM(CASE when XX = '10' then YY else 0 END) AS 'xx=10'
  ,SUM( CASE when XX = '20' then YY else 0 END) AS 'xx=20'
  ,SUM( CASE when XX = '30' then YY else 0 END) AS 'xx=30'
  ,SUM( CASE when XX = '40' then YY else 0 END) AS 'xx=40'
  FROM temp_0
  group by Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...