2016-06-21 4 views
1

По общему признанию, я плохо разбираюсь в pivot/univot, но, похоже, это относится к более прямому «транспонированию», чем того, что я ищу. Что мне нужно сделать, так это создать набор результатов с 1 строкой для каждого из столбцов в таблице.SQL возвращает 1 строку в результатах для каждого столбца в таблице

Quarters Таблица:

USER Q1 Q2 Q3 Q4 
----------------------- 
USER1 1 5 3 3 
USER2 2 1 1 8 

Желательные Результаты:

USER Q V 
-------------- 
USER1 Q1 1 
USER1 Q2 5 
USER1 Q3 3 
USER2 Q4 3 
USER2 Q1 2 
USER2 Q2 1 
USER2 Q3 1 
USER2 Q4 1 
+0

Возможный дубликат: http://stackoverflow.com/questions/19055902/unpivot-with-column-name –

+0

@MahediSabuj Спасибо, это абсолютно точная такой же выпуск. Мне кажется, что название этого вопроса может быть рассмотрено, в настоящее время это похоже на то, чтобы знать ответ на вопрос, чтобы найти вопрос. Определенно пробовал погулять много разных вещей и так и не нашел этого. Спасибо за помощь. –

+0

У меня недостаточно репутации, чтобы прокомментировать ответы на этот вопрос, но я хотел бы знать, есть ли способ включить значения NULL. –

ответ

4

А "смешно" способ сделать это будет использовать CROSS APPLY:

SELECT Q.[USER], 
     X.Q, 
     X.V 
FROM dbo.Quarters Q 
CROSS APPLY 
(
    VALUES 
     ('Q1', t.Q1), 
     ('Q2', t.Q2), 
     ('Q3', t.Q3), 
     ('Q4', t.Q4) 
) X (Q, V); 
+0

Это действительно лучшая работа! Метод Мэтта работал хорошо, но у него были проблемы с некоторыми столбцами бит. –

2

убедитесь, что значение, используемое для исключение null не представлено в вашем наборе данных!

SELECT 
    [user] 
    ,V = IIF(V = -99999,NULL,V) 
    ,Q 
FROM 
    (
    SELECT 
     [user] 
     ,Q1 = ISNULL(t.Q1,-99999) 
     ,Q2 = ISNULL(t.Q2,-99999) 
     ,Q3 = ISNULL(t.Q3,-99999) 
     ,Q4 = ISNULL(t.Q4,-99999) 
    FROM 
     @Table t) p 

    UNPIVOT 
     (V FOR Q IN (Q1,Q2,Q3,Q4) 
     ) as unpvt 

Для обеспечения нулевой на душу комментарий, необходимо использовать хак, чтобы установить нулевое значение, как что-то другое и положить его обратно в нуль. (SQL Server - Include NULL using UNPIVOT) Когда желание включить метод перекрестного притяжения становится немного более привлекательным для меня.

Мне кажется, UNPIVOT отлично подойдет для вас, потому что у вас есть известное количество кварталов.

И для справки здесь ссылка на сайт Mirosoft на PIVOT и UNPIVOT. https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

+0

любой способ включения нулей? –

+0

http://stackoverflow.com/questions/1002989/sql-server-include-null-using-unpivot, похоже, что вы можете использовать crossLLakak Cross, если хотите получить нуль, потому что вам придется немного взломать его, чтобы получить это с univot, но я обновлю свой ответ с помощью, чтобы сделать это. – Matt

+0

@ Steve'Kepano'Eggering обновлен по методу – Matt

3

С помощью UNPIVOT запрос становится еще проще. с UNPIVOT запрос будет выглядеть примерно так ....

Select Users 
    , Q 
    , V 
FROM TableName 
    UNPIVOT (
      V FOR Q IN (Q1,Q2,Q3,Q4) 
      )up 
+0

@Matt я могу задать вам тот же вопрос? –

+0

@Matt не то, что есть большая разница, но в чем смысл использовать 'SELECT * FROM (SELECT * FROM Tablename) ...' вместо просто 'SELECT * FROM Tablename ....'? – Lamak

+0

Я не видел вашего ответа вообще, пока я не опубликовал сообщение, его говорит 4 минуты рядом с нашими ответами –