sql — Транспонирование таблицы (строки в столбцы)

Какой запрос может транспонировать таблицу (строки станут столбцами)?

Причем, без использования функции pivot.

6

Обычный запрос, это просто.

Было:

select * from t1
/
NAME      VALUE
---- ----------
Вася        427
Петя        379
Маша        254
Паша        881
Коля        481

Стало:

select
    sum (case name when 'Вася' then value end) "Вася",
    sum (case name when 'Петя' then value end) "Петя",
    sum (case name when 'Маша' then value end) "Маша",
    sum (case name when 'Паша' then value end) "Паша",
    sum (case name when 'Коля' then value end) "Коля"
from t1
/
      Вася       Петя       Маша       Паша       Коля
---------- ---------- ---------- ---------- ----------
       427        379        254        881        481

Почитайте про Pivot. Но и это не полное транспонирование в понимании матриц. Так как таблица в базе данных это не матрица.

На выборку типа

  SELECT DaysToManufacture, 
          AVG(StandardCost) AS AverageCost   
  FROM Production.Product  
  GROUP BY DaysToManufacture;  
DaysToManufacture AverageCost
----------------- -----------
0                 5.0885
1                 223.88
2                 359.1082
4                 949.4105

Применив pivot

  SELECT 'AverageCost' AS 
          Cost_Sorted_By_Production_Days,   
          [0], [1], [2], [3], [4]  
  FROM  
      (SELECT DaysToManufacture, 
              StandardCost   
       FROM Production.Product) AS SourceTable  
  PIVOT  
  (  
    AVG(StandardCost)  
    FOR DaysToManufacture IN ([0], [1], [2], [3], [4])  
  ) AS PivotTable;  

Мы получим

Cost_Sorted_By_Production_Days 0           1           2           3           4         
------------------------------ ----------- ----------- ----------- ----------- -----------
AverageCost                    5.0885      223.88      359.1082    NULL        949. 4105
4

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Смена таблицы в SQL Server — SQL Server

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья

В этой статье описывается, как повернуть таблицу в SQL Server.

Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 175574

Аннотация

В этой статье описывается, как повернуть таблицу SQL Server. Предположим, что у вас есть таблица с именем QTRSALES. Таблица содержит столбцы YEAR, QUARTERи AMOUNT с данными в следующем формате.

Примечание.

За четвертый квартал 1996 года нет строки:

ГодКварталAmount
19951125,000.90
19952136,000.75
19953212,000.34
19954328,000.82
19963728,000.35
19962422,000.13
19961328,000.82

Теперь предположим, что вы хотите повернуть таблицу, чтобы увидеть данные в следующем формате:

YEARQ1В 2-й кварталВ3Вопрос 4
1995125,000. 90136,000.75212,000.34328,000.82
1996328,000.82422,000.13728,000.350.00

Запрос, который будет использоваться для смены таблицы, приведен в следующем разделе этой статьи.

Пример запроса для смены таблицы

Ниже приведен запрос, который будет использоваться для смены таблицы:

SELECT YEAR,
Q1= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 1 AND YEAR =
Q.YEAR),0),
Q2= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 2 AND YEAR =
Q.YEAR),0),
Q3= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 3 AND YEAR =
Q.YEAR),0),
Q4= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 4 AND YEAR =
Q.YEAR),0)
FROM QTRSALES Q
GROUP BY YEAR

Запрос для больших таблиц

Для больших таблиц этот запрос будет выполняться быстрее:

year=q.year,
SUM(CASE quarter WHEN 1 THEN amount ELSE 0 END) as Q1,
SUM(CASE quarter WHEN 2 THEN amount ELSE 0 END) as Q2,
SUM(CASE quarter WHEN 3 THEN amount ELSE 0 END) as Q3,
SUM(CASE quarter WHEN 4 THEN amount ELSE 0 END) as Q4
FROM qtrsales q
GROUP BY year

Ссылка

FROM — использование PIVOT и UNPIVOT

SQL Server — сводное преобразование строк в столбцы (с дополнительными данными строк)

Задавать вопрос

спросил

Изменено 2 года, 11 месяцев назад

Просмотрено 7к раз

Может ли кто-нибудь помочь мне с этим SQL?

Я хочу объединить несколько строк в столбцы по: идентификатору, типу, цвету, дате

Задача: у меня есть несколько столбцов, которые я хочу сохранить/показать в сводной таблице.

 идентификатор | тип | цвет | дата | код_страны | расходы
---+--------+--------+------------+---------------+- ------
1 | отчет | красный | 2020-09-01| США | 1
1 | отчет | красный | 2020-09-01| ЕС | 2
1 | отчет | красный | 2020-09-01| РУ | 3
1 | отчет | красный | 2020-09-01| АП | 4
1 | отчет | синий | 2020-09-02| США | 5
1 | отчет | синий | 2020-09-02| ЕС | 6
1 | отчет | синий | 2020-09-02| РУ | 7
1 | отчет | синий | 2020-09-02| АП | 8
2 | отчет | зеленый | 2020-09-02| США | 9
2 | отчет | зеленый | 2020-09-02| ЕС | 10
2 | отчет | зеленый | 2020-09-02| РУ | 11
2 | отчет | зеленый | 2020-09-02| АП | 12
2 | отчет | синий | 2020-09-03| США | 13
2 | отчет | синий | 2020-09-03| ЕС | 14
2 | отчет | синий | 2020-09-03| РУ | 15
2 | отчет | синий | 2020-09-03| АП | 16
 

Желаемый результат:

 id | тип | цвет | дата | США | ЕС | РУ | АП
---+--------+-------+-------------+----+----+----+- ---
1 | отчет | красный | 2020-09-01 | 1 | 2 | 3 | 4
1 | отчет | синий | 2020-09-02 | 5 | 6 | 7 | 8
2 | отчет | зеленый | 2020-09-02 | 9 | 10 | 11 | 12
2 | отчет | синий | 2020-09-03 | 13 | 14 | 15 | 16
 

Известная информация:

  • всего 4 кода страны.
  • значение цвета будет одинаковым для: идентификатора, типа, даты.

Не знаю, какой самый чистый/лучший способ написать этот SQL.

Я пытался использовать

 ROW_NUMBER() OVER (РАЗДЕЛ ПО xxx ORDER BY yyy)
 

и PIVOT , но не смог получить результаты, которые я искал

  • sql
  • sql-server
  • pivot
  • unpivot
  • partition-by 9 0028

Я думаю, что условная агрегация делает то, что вы хотите:

 выберите идентификатор, тип, цвет, дату,
       max(случай, когда код_страны = 'US', тогда стоимость заканчивается) как мы,
       max(случай, когда код_страны = 'EU', а затем конец стоимости) как eu,
       max(случай, когда country_code = 'RU', тогда стоимость заканчивается) как ru,
       max(случай, когда код_страны = 'AP', затем окончание стоимости) как AP
от т
группировать по идентификатору, типу, цвету, дате;
 
5

Я поигрался и думаю, что получил это:

 SELECT id, type, color, date, [US], [EU], [RU], [AP]
ОТ
(
  ВЫБЕРИТЕ идентификатор, тип, цвет, дату, код страны, стоимость ИЗ таблицыX
) т
ВРАЩАТЬСЯ
(
  МАКС(стоимость)
  FOR country_code IN ( [US], [EU], [RU], [AP] )
) п
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

sql server — запрос SQL, который может преобразовать строки в столбец

Задавать вопрос

спросил

Изменено 1 год, 2 месяца назад

Просмотрено 1к раз

RuModules_Id Информация
9 1,1,49
16 1,0,50
16 2,0,51
16 3,0,52
16 4,0,53
17 1,0,54
17 2,0,55
17 3,0,56
17 4,0,57
18 1,0,58

Мне нужно преобразовать таблицу A в таблицу B. Может ли кто-нибудь помочь мне, как это сделать в SQL-запросе?

  • sql
  • sql-сервер
  • tsql
7

Возможные подходы: условное агрегирование и оператор отношения PIVOT. Вам нужно пронумеровать строки и сгруппировать их соответствующим образом (даже если у вас более 4 строк для каждых 9 строк).0030 RuModules_Id ):

Оператор с условной агрегацией:

 SELECT
   RuModules_Id,
   M1 = МАКС (СЛУЧАЙ, КОГДА RN% 4 = 0, ТОГДА информация КОНЕЦ),
   M2 = МАКС (СЛУЧАЙ, КОГДА RN% 4 = 1, ТОГДА информация КОНЕЦ),
   M3 = МАКС (СЛУЧАЙ, КОГДА RN % 4 = 1, ТОГДА информация КОНЕЦ),
   M4 = МАКС (СЛУЧАЙ, КОГДА RN % 4 = 2, ТОГДА Информация КОНЕЦ)
ОТ (
   SELECT *, ROW_NUMBER() OVER (PARTITION BY RuModules_Id ORDER BY Info) - 1 AS Rn
   ИЗ данных
) т
СГРУППИРОВАТЬ ПО RuModules_Id, Rn/4
 

Заявление с PIVOT:

 SELECT RuModules_Id, M1, M2, M3, M4
ОТ (
   ВЫБИРАТЬ
      (ROW_NUMBER() OVER (PARTITION BY RuModules_Id ORDER BY Info) - 1) / 4 AS Id,
      *,
      CASE (ROW_NUMBER() OVER (PARTITION BY RuModules_Id ORDER BY Info) - 1) % 4
         КОГДА 0 ТОГДА 'M1'
         КОГДА 1 ТОГДА 'M2'
         КОГДА 2, ТОГДА 'M3'
         КОГДА 3, ТО 'M4'
      КОНЕЦ КАК М
   ИЗ данных
) т
ВРАЩАТЬСЯ (
   МАКС(Информация)
   ДЛЯ M IN ([M1], [M2], [M3], [M4])
) п
 

Зависит от того, какую базу данных SQL вы используете.

Кроме того, в вашей таблице A отсутствует столбец, содержащий «M1», «M2» и т. д. В приведенном ниже решении я ожидаю, что структура данных будет следующей:

 ModuleId | RuModules_Id | Информация
М1 | 9 | 1,1,49
 

Если вы используете SQL Server, вы можете выполнить сводку.

Синтаксис примерно такой:

 SELECT * FROM (
  ВЫБИРАТЬ
    [ModuleId]
    [RuModules_Id],
    [Информация]
  ИЗ
) A_sub
ВРАЩАТЬСЯ (
  МАКС([Информация])
  ДЛЯ [ModuleId]
  В (
    [М1],
    [М2],
    [М3],
    [М4]
  )
) КАК сводная таблица
 

В приведенном выше примере (не проверенном) будут построены столбцы M1,M2,M3,M4, добавлена ​​строка для каждого уникального значения, найденного в RuModules_Id, и в каждой продаже максимальное значение, найденное в [Info] для конкретной комбинации ModuleId и RuModules_Id будут перечислены.

Невозможно выполнить динамическое решение с необработанным SQL. Вам нужно знать, какие именно столбцы вы создаете (в нашем примере мы создали M1, M2, M3, M4.