SQL возвращает 1 строку результатов для каждого столбца в таблице

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

Таблица четвертей:

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

person Steve Eggering    schedule 21.06.2016    source источник
comment
Возможный дубликат: stackoverflow.com/questions/19055902/unpivot-with-column -имя   -  person Mahedi Sabuj    schedule 21.06.2016
comment
@MahediSabuj Спасибо, это точно такая же проблема. Мне кажется, что название этого вопроса можно было бы уточнить, в настоящее время это похоже на необходимость знать ответ на вопрос, чтобы найти вопрос. Определенно пробовал гуглить много разных вещей и так и не нашел. Спасибо за помощь.   -  person Steve Eggering    schedule 21.06.2016
comment
У меня недостаточно репутации, чтобы комментировать ответы на этот другой вопрос, но я хотел бы знать, есть ли способ включить значения NULL.   -  person Steve Eggering    schedule 21.06.2016


Ответы (3)


"Забавный" способ сделать это - использовать 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);
person Lamak    schedule 21.06.2016
comment
Это на самом деле делает лучшую работу! Метод Мэтта работал хорошо, но возникли проблемы с некоторыми битовыми столбцами. - person Steve Eggering; 22.06.2016

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

Select Users 
     , Q 
     , V
FROM TableName
  UNPIVOT (
            V FOR Q IN (Q1,Q2,Q3,Q4)
           )up
person M.Ali    schedule 21.06.2016
comment
@ Мэтт, могу я задать тебе тот же вопрос? - person M.Ali; 21.06.2016
comment
@ Мэтт, не то чтобы большая разница, но какой смысл использовать SELECT * FROM (SELECT * FROM Tablename)... вместо просто SELECT * FROM Tablename ....? - person Lamak; 21.06.2016
comment
Я вообще не видел вашего ответа, пока не опубликовал свой, рядом с обоими нашими ответами написано 4 минуты. - person M.Ali; 21.06.2016
comment
Я знаю М.Али, я сам делал это несколько раз, для меня это показывает, что я опережаю вас на минуту, так что, вероятно, это всего лишь секунды :) мы просто оставим это, поскольку великие умы думают одинаково :) - person Matt; 21.06.2016
comment
@Matt Итак, вы говорите, что этот ответ неверен ?, поскольку он не использует внутренний оператор выбора - person Lamak; 21.06.2016
comment
@ Мэтт, я знаю, что этот ответ не является неправильным, но ты сказал, что нужны оба SELECT, когда они не нужны. - person Lamak; 21.06.2016
comment
Мэтт и М. Али оба ответа выполняют свою работу чисто, и я иногда вижу разницу в 1 минуту в ответах, я уверен, что вы оба печатали одновременно, но ничья достается бегуну или что-то в этом роде, так что Сегодня М. Али получает зеленую галочку. - person Steve Eggering; 21.06.2016
comment
@ M.Ali, как включить нули? - person Steve Eggering; 21.06.2016

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

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 - включить NULL с помощью UNPIVOT) При желании включить перекрестное применение метод становится немного более привлекательным для меня.

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

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

person Matt    schedule 21.06.2016
comment
любой способ включить нули? - person Steve Eggering; 21.06.2016
comment
stackoverflow.com/questions/1002989/ кажется, что вы можете использовать перекрестное применение @Lamak, если вам нужны нули, потому что вам придется немного взломать его, чтобы получить его с помощью unpivot, но я обновлю свой ответ, указав, как это сделать. - person Matt; 21.06.2016