SQL Server PIVOT возможно? - PullRequest
       13

SQL Server PIVOT возможно?

6 голосов
/ 25 августа 2011

SELECT Name1, Name2, Value FROM mytable дает мне следующий набор результатов:

Name1 Name2 Value
A     P1     1
A     P2     1
A     P3     2
B     P1     3
B     P2     1
B     P4     1

Как мне перевести это на:

       A     B
P1     1     4
P2     1     1
P3     2     null
P4     null  1

Спасибо

Ответы [ 3 ]

11 голосов
/ 25 августа 2011

Поскольку вы используете SQL Server 2005, вот код:

DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)

SELECT  @cols = STUFF(( SELECT distinct  ',' + QuoteName([Name1])
                        FROM myTable FOR XML PATH('') ), 1, 1, '') 


SET @sqlquery = 'SELECT * FROM
      (SELECT Name2, Name1, Value
       FROM myTable ) base
       PIVOT (Sum(Value) FOR [Name1]
       IN (' + @cols + ')) AS finalpivot'

EXECUTE ( @sqlquery )

Это будет работать независимо от того, сколько у вас разных статусов. Он динамически собирает запрос с PIVOT. Единственный способ сделать PIVOT с динамическими столбцами - это динамически собрать запрос, что можно сделать в SQL Server.

Другие примеры:

4 голосов
/ 25 августа 2011

У меня нет SQL Server, работающего здесь, на работе, так что это может быть не полностью синтетически правильным, но одним из подходов будет кросс-табуляция

SELECT name2
     , SUM(CASE WHEN name1 = 'A' THEN value END) AS A
     , SUM(CASE WHEN name1 = 'B' THEN value END) AS B
FROM table
GROUP BY name2

Для переменного числа столбцов вы можете использовать динамический SQL:

DECLARE @sql varchar(max)
SELECT @sql = COALESCE(@sql+',','') + 'SUM(CASE WHEN nane1 = '''+name1+''' THEN value END) AS ['+name1']' FROM table

SET @sql = 'SELECT name2, '+@sql+' FROM table GROUP BY name2'

EXEC(@sql)
2 голосов
/ 25 августа 2011

Вы можете использовать предложение PIVOT . Ваш запрос может быть что-то вроде этого:

WITH Source as (
    SELECT Name1, Name2, [Value]
    FROM mytable 
)

SELECT Name2, CASE WHEN A IS NOT NULL THEN A ELSE 'your string' END As A
, CASE WHEN B IS NOT NULL THEN B ELSE 'your string' END As B
FROM (
        SELECT Name2, Name1, [Value]
        FROM Source
) s
PIVOT 
(
    MAX([Value]) FOR Name1 IN (A, B) -- any other Name1 would go here
) p

используя данные выше, мои результаты были

P1  1           3
P2  1           1
P3  2           your string
P4  your string 1

EDIT:

Так как у вас есть неизвестное количество столбцов, вам нужно взглянуть на использование динамического SQL, и здесь на SO есть несколько ответов на этот вопрос с PIVOT.

Сводная таблица SQL Server 2005 с неизвестным числом столбцов

Сводная таблица и объединенные столбцы

...