Транспонирование таблицы sql: Как транспонировать в sql — Q&A Хекслет

SQL: Транспонирование таблиц(?) — Меркантильный гуру — LiveJournal

?

March 24th, 2010


02:42 am — SQL: Транспонирование таблиц(?)
Когда для некоторой строчки может дополнительно быть произвольное количество произвольных дополнительных полей — хорошо их вынести в отдельную табличку вида tbl(id*, parent, field, value). Однако потом, иногда, хочется получить их для определенного parent не ввиде таблицы, а ввиде строки. Если набор полей так или иначе известен — можно сделать

SELECT
(value FROM tbl WHERE parent=? AND field=?) AS field_1,
(value FROM tbl WHERE parent=? AND field=?) AS field_2,
[. ..];

Однако это и не оптимально, и некрасиво, и требует знания всех полей. Есть ли более оптимальный и красивый способ получить их ввиде строки (переписать то же самое на JOIN будет намного менее красивым, хотя более оптимальным) и можно ли обойтись без знания зарания набора значений поля field?


From:norguhtar
Date:March 24th, 2010 03:19 am (UTC)
(Link)

Средствами SQL нет.

(Reply) (Thread)

From:plumqqz
Date:March 24th, 2010 05:38 am (UTC)

В чем проблемы?

(Link)
pivot_clause
The pivot_clause lets you write cross-tabulation queries that rotate rows into
columns, aggregating data in the process of the rotation.  The output of a pivot
operation typically includes more columns and fewer rows than the starting data set.

Ну т.д.

(Reply) (Thread)

From:serge146
Date:March 25th, 2010 12:43 pm (UTC)
(Link)

Завести поле со значением во всех ячекйках, например «0» и переворачивать относительно него. Если нужно подробнее — я посмотрю как мы делали это в нашей программе.

(Reply) (Thread)


> Go to Top
LiveJournal.com

Как транспонировать в sql

Обратите внимание, что значения в FieldName не ограничиваются именем пользователя, паролем и адресом электронной почты. Они могут быть чем угодно, так как они определены пользователем.

Есть ли способ сделать это в SQL?

1 ответ

MySQL не поддерживает синтаксис ANSI PIVOT /UNPIVOT, так что вам остается использовать:

Как видите, операторы CASE должны быть определены для каждого значения. Чтобы сделать это динамичным, вам нужно использовать Синтаксис подготовленного оператора MySQL (динамический SQL) .

Я пробовал транпозу, но не нашел хорошего образца для получения этой таблицы в Teradata:

Спасибо за помощь.

1 ответ

я искал в течение нескольких часов без реального решения. Я хочу настроить постоянную задачу (каждую ночь). У меня есть таблица в базе данных Teradata на сервере 1. Каждую ночь мне нужно копировать всю таблицу из этого экземпляра teradata на мой сервер разработки (сервер 2), который имеет MySQL.

У меня есть таблица SQL, которая сохраняет значения, как показано на рисунке ниже Теперь мне нужно транспонировать эту таблицу, как показано ниже. Мне нужно сделать это без использования хранимой процедуры. Я пытаюсь привязать 2-ю таблицу к столбцу 4 datagridview checkbox.

случай использования, когда

Похожие вопросы:

Я использую Teradata. Я бы хотел переименовать таблицу со скриптом sql и не использовать bteq, если выполняются определенные условия. В частности: если TABLE_A существует => переименуйте таблицу.

Как транспонировать строки и столбцы из запроса SQL, как показано ниже. Использование SQL Server 2012 для написания запроса, который будет работать даже при добавлении данных в таблицу базы данных

Я хотел бы создать таблицу из набора данных, сгенерированного функцией teradata help table, чтобы добавить дополнительную информацию о таблице и иметь возможность фильтровать строки по условиям.

я искал в течение нескольких часов без реального решения. Я хочу настроить постоянную задачу (каждую ночь). У меня есть таблица в базе данных Teradata на сервере 1. Каждую ночь мне нужно копировать.

У меня есть таблица SQL, которая сохраняет значения, как показано на рисунке ниже Теперь мне нужно транспонировать эту таблицу, как показано ниже. Мне нужно сделать это без использования хранимой.

Я хочу транспонировать эту таблицу, которая имеет только 1 строку с идентификатором клиента и столбцами ответа как response1, response2 и так далее. Я пробовал с pivot, но не смог правильно.

Как создать временную таблицу в teradata SQL Assistant? У меня есть запрос, который работает очень медленно, и я хочу оптимизировать его, создав временную таблицу. Я хочу иметь возможность.

кто-нибудь может мне помочь с этим, пожалуйста? Я хочу вставить данные в таблицу в Teradata SQL Assistant, но вставить только то, что не существует в таблице. У меня есть идеальный способ сделать.

Я хотел бы спросить вас, как переместить стол из SAS в TeradataSQL помощника. То, что я сделал в SAS, — это определить имя libname, а затем создать таблицу, которую я хочу переместить в Teradata.

У меня есть некоторые проблемы при создании таблицы в SQL/teradata,, так как простой следующий код успешно создает таблицу, но не вставляет в нее данные : CREATE VOLATILE MULTISET TABLE tablename.

как я могу просто переключать столбцы со строками в SQL? Есть ли простая команда для транспонирования?

ie повернуть этот результат:

PIVOT кажется слишком сложным для этого сценария.

8 ответов:

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

однако, если у вас нет доступа к этим функциям, это может быть реплицировано с помощью UNION ALL до UNPIVOT а затем агрегатная функция с CASE заявление PIVOT :

создать Таблица:

соединение все, агрегат и версия случая:

посмотреть SQL Скрипка с демо

The UNION ALL выполняет UNPIVOT данных путем преобразования столбцов Paul, John, Tim, Eric в отдельных строках. Затем вы применяете агрегатную функцию sum() С case утверждение, чтобы получить новые столбцы для каждого color .

преобразование и сводных статических Версия:

и UNPIVOT и PIVOT функции в SQL server делают это преобразование намного проще. Если вы знаете все значения, которые вы хотите преобразовать, вы можете жестко закодировать их в статической версии, чтобы получить результат:

посмотреть SQL Скрипка с демо

внутренний запрос с UNPIVOT выполняет ту же функцию, что и UNION ALL . Он берет список столбцов и превращает его в строки, PIVOT затем выполняет окончательное преобразование в столбцы.

Динамическая Версия Pivot:

если у вас есть неизвестное количество столбцов ( Paul, John, Tim, Eric в вашем примере), а затем неизвестное количество цветов для преобразования вы можете использовать динамический sql для создания списка в UNPIVOT а то PIVOT :

посмотреть SQL Скрипка с демо

динамическая версия запрашивает оба yourtable а то sys.columns таблица для создания список элементов UNPIVOT и PIVOT . Это затем добавляется в строку запроса для выполнения. Плюсом динамической версии является то, что у вас есть изменяющийся список colors и/или names это создаст список во время выполнения.

все три запроса приведут к одному и тому же результату:

обычно это требует, чтобы вы заранее знали все метки столбцов и строк. Как вы можете видеть в приведенном ниже запросе, все метки перечислены в их полностью в операциях UNPIVOT и (re)PIVOT.

Настройка схемы MS SQL Server 2012:

запрос 1:

результаты:

Дополнительная Информация:

  1. дана таблица имя, вы можете определить все имена столбцов из sys.колонки или для XML обмана с помощью local-name ().
  2. вы также можете создать список различных цветов (или значений для одного столбца), используя для XML.
  3. вышеизложенное может быть объединено в динамический пакет sql для обработки любой таблицы.
  • вертикальное расширение

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

  • горизонтальное расширение

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

  • расстройства

    основное ограничение транспонирования строк в столбцы с помощью Курсор является недостатком, который связан с использованием курсоров в целом – они приходят при значительных затратах на производительность. Это происходит потому, что курсор создает отдельный запрос для каждой следующей операции выборки.

  • вертикальное расширение

    подобно PIVOT и Курсору, недавно добавленные политики могут быть получены в XML-версии сценария без изменения исходного сценария.

  • горизонтальное расширение

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

  • расстройства

    с точки зрения ввода – вывода статистика XML – версии скрипта почти аналогична сводной-единственное отличие заключается в том, что XML имеет второе сканирование таблицы dtTranspose, но на этот раз из логического кэша чтения данных.

на основе этого решение С bluefeet вот хранимая процедура, которая использует динамический sql для создания транспонированной таблицы. Он требует, чтобы все поля были числовыми, за исключением транспонированного столбца (столбец, который будет заголовком в результирующей таблице):

вы можете проверить его с помощью таблицы, поставляемой с этой командой:

я делаю UnPivot сначала и сохранение результатов в CTE и с помощью CTE на Pivot операции.

демо

добавление к потрясающему ответу @Paco Zarate выше, если вы хотите транспонировать таблицу, которая имеет несколько типов столбцов, затем добавьте это в конец строки 39, поэтому она только транспонирует int столбцы:

вот полный запрос, который был изменен:

найти другие system_type_id ‘ s, запустите это:

мне нравится делиться кодом, который я использую для транспонирования разделенного текста на основе ответа + bluefeet. В этом приближении я реализован как процедура в MS SQL 2005

Я смешиваю это решение с информацией о том, как упорядочить строки без порядка по (SQLAuthority.com) и функция разделения на MSDN (social.msdn.microsoft.com)

когда вы выполняете prodecure

вы получаете следующее результат

таким образом, преобразуйте все данные из полей(столбцов) в таблице в запись (строку).

Номеров телефонов может быть разное т.к. сегодня звонки были только на 2 телефона, а завтра на 4, к примеру.

Какими командами это можно сделать? Была идея взять отдельно 2 и 3 колонку и повернуть их, но как потом обратно вернуть первую колонку я не придумал.

Нужно транспонировать таблицу
Добрый день! есть две таблицы: 1) Таблица скидок — id скидки — название.

Транспонировать одну таблицу и связать вывод со второй
Всем привет! Есть две таблицы: CREATE TABLE Options ( id_opt smallint NOT NULL PRIMARY KEY.

Транспонировать строки teradata
Добрый день, коллеги. Прошу помощи. Необходимо транспонировать строки с цикличной обработкой.

Транспонировать несколько столбцов таблицы
Всем доброго времени суток! Нужна помощь знатоков SQL. С SQL только недавно начал знакомиться и.

сервер sql — транспонирование MS SQL как транспонирование Excel (динамический SQL)

Мне нужен динамический код SQL, аналогичный операции транспонирования excel.
Я пробовал транспонировать таблицу с помощью Dynamic SQL.
Я пробовал Pivot/XML, Dynamic SQL. Разобрать. Я потерпел неудачу.
Я пробовал CAST (сопоставление столбцов database_default AS NVARCHAR (MAX)) преобразования.

Что я делаю не так? Как я могу написать код?

Моя конечная цель — создать составную таблицу, полученную в результате следующего запроса. Как видите, в этой таблице образцы столбцов пусты. Я хочу выполнить запрос «цикла while», чтобы заполнить эти значения. Перед созданием цикла мне нужен код, аналогичный операции транспонирования Excel. С помощью этой операции я могу скопировать результаты в составную таблицу.

 ВЫБЕРИТЕ A.TABLE_CATALOG, A. TABLE_SCHEMA, B.COLUMN_CNT, B.DUM_TABLE_POSITION,
A.ORDINAL_POSITION AS DEF_COLUMN_POSITION, A.TABLE_NAME, A.COLUMN_NAME,
SAMPLE_1=NULL,SAMPLE_2=NULL,SAMPLE_3=NULL,SAMPLE_4=NULL,SAMPLE_5=NULL,
SAMPLE_6=NULL,SAMPLE_7=NULL,SAMPLE_8=NULL,SAMPLE_9=NULL,SAMPLE_10=NULL
ИЗ INFORMATION_SCHEMA.COLUMNS A,
(ВЫБЕРИТЕ TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,COUNT(*) AS COLUMN_CNT,
ROW_NUMBER() OVER (ORDER BY TABLE_NAME) AS DUM_TABLE_POSITION
ИЗ INFORMATION_SCHEMA.COLUMNS
СГРУППИРОВАТЬ ПО TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
СЧЕТЧИК(*)>0 ) B
ГДЕ A.TABLE_CATALOG=B.TABLE_CATALOG
И A.TABLE_SCHEMA=B.TABLE_SCHEMA
И A.TABLE_NAME=B.TABLE_NAME
И A.TABLE_CATALOG='DWH_PROD'
И A.TABLE_SCHEMA='dbo'
И A.TABLE_NAME IN (N'DWH_PROD.dbo.MY_TABLE_1', N'DWH_PROD.dbo.MY_TABLE_2')
 

введите здесь описание изображения

. ……………………….

Демонстрационные данные

 CREATE TABLE #temporary_table
(CUS_ID INT,
ТИТУЛ НВАРЧАР (50),
ПРОМОУТЕР НВАРЧАР (50),
CUS_STATUS NVARCHAR (50))
;
ВСТАВИТЬ В #temporary_table
ЦЕННОСТИ
(11,'A',НУЛЬ,'ПАССИВ'),
(22, 'B', NULL, 'АКТИВНО'),
(33,'D',NULL,'ACTIVE'),
(44, 'В', НУЛЬ, 'АКТИВНО'),
(55, 'B', NULL, 'АКТИВНО'),
(66,'C',NULL,'ACTIVE'),
(77,'D',NULL,'ACTIVE'),
(88,'D',NULL,'ACTIVE'),
(101,'D',NULL,'ACTIVE'),
(123,'D',NULL,'ACTIVE'),
(200,'D',NULL,'ACTIVE'),
(300, 'А', НУЛЬ, 'ПАССИВ')
;
SELECT TOP 10 CONCAT('SAMPLE_', ROW_NUMBER() OVER( ORDER BY (SELECT 1)) ) AS AAA,*
ОТ #temporary_table
 

Я могу получить результаты отдельно с помощью одного кода ниже. Но этот результат не соответствует моей просьбе.

 DECLARE @sql nvarchar(max) = N'';
ВЫБЕРИТЕ @sql += N'
SELECT TOP (10) [таблица] = N''' + REPLACE (имя, '''','') + ''', *
ОТ ' + QUOTENAME(SCHEMA_NAME([schema_id]))
+ '.' + QUOTENAME(имя) + ';'
ИЗ sys.tables AS t
ГДЕ имя В (N'DWH_PROD. dbo.MY_TABLE_1', N'DWH_PROD.dbo.MY_TABLE_2')
EXEC sys.sp_executesql @sql;
 

РЕДАКТИРОВАТЬ::::::::::::::::::::::::::::

Большое спасибо @John Cappelletti Я почти закончил запрос. Код работает на сервере 2014. Все остальные сценарии я не тестировал. Если для первых 10 строк столбца есть только значения NULL, второе имя таблицы будет отображаться как NULL.

 -- УДАЛИТЬ СТОЛ #HamdullahUstadKacincidir2
-- DROP TABLE #HamdullahUstadKacincidir
СОЗДАТЬ СТОЛ #HamdullahUstadKacincidir2
(ИМЯ_СТОЛОНЦА NVARCHAR (МАКС.),
SAMPLE_1 NVARCHAR (МАКС.),
SAMPLE_2 NVARCHAR (МАКС.),
SAMPLE_3 NVARCHAR (МАКС.),
SAMPLE_4 NVARCHAR (МАКС.),
SAMPLE_5 NVARCHAR (МАКС.),
SAMPLE_6 NVARCHAR (МАКС.),
SAMPLE_7 NVARCHAR (МАКС.),
SAMPLE_8 NVARCHAR (МАКС.),
SAMPLE_9 NVARCHAR (МАКС.),
SAMPLE_10 NVARCHAR (МАКС))
CREATE TABLE #HamdullahUstadKacincidir
(ИМЯ ТАБЛИЦЫ NVARCHAR (МАКС.),
COLUMN_NAME NVARCHAR (МАКС.),
SAMPLE_1 NVARCHAR (МАКС.),
SAMPLE_2 NVARCHAR (МАКС.),
SAMPLE_3 NVARCHAR (МАКС.),
SAMPLE_4 NVARCHAR (МАКС. ),
SAMPLE_5 NVARCHAR (МАКС.),
SAMPLE_6 NVARCHAR (МАКС.),
SAMPLE_7 NVARCHAR (МАКС.),
SAMPLE_8 NVARCHAR (МАКС.),
SAMPLE_9НВАРЧАР (МАКС),
SAMPLE_10 NVARCHAR (МАКС))
ОБЪЯВИТЬ @SourceTableName КАК NVARCHAR (МАКС.)
ОБЪЯВИТЬ @SourceTableSql КАК NVARCHAR (МАКСИМАЛЬНО)
ОБЪЯВИТЬ @SourceTableSql22 КАК NVARCHAR (МАКС)
ОБЪЯВИТЬ @SourceTableSql333 КАК NVARCHAR (МАКС.)
ОБЪЯВИТЬ @TableI INT
ОБЪЯВИТЬ @TableIN NVARCHAR(MAX)
ОБЪЯВИТЬ @SampleSize INT
ОБЪЯВИТЬ @TableCount INT
УСТАНОВИТЬ @ТаблицаI=1
УСТАНОВИТЕ @SampleSize= 10
УСТАНОВИТЬ @TableCount= (ВЫБРАТЬ COUNT(*) AS MAX_TABLE_CNT
ОТ
(ВЫБЕРИТЕ TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,COUNT(*) AS COLUMN_CNT
ИЗ INFORMATION_SCHEMA.COLUMNS
WHERE CONCAT(TABLE_CATALOG,'.', TABLE_SCHEMA,'.', TABLE_NAME) NOT IN --Имеет хотя бы один столбец Geography Data_Type
(ВЫБЕРИТЕ CONCAT(C.TABLE_CATALOG,'.', C.TABLE_SCHEMA,'.', C.TABLE_NAME) AS TABLE_HAS_GEOGRAPHY_DATA_TYPE
ИЗ INFORMATION_SCHEMA.COLUMNS C
ГДЕ DATA_TYPE='География')
AND CONCAT(TABLE_CATALOG,'.', TABLE_SCHEMA,'. ', TABLE_NAME) NOT IN --Eliminate Empty Tables
(ВЫБЕРИТЕ CONCAT(C.TABLE_CATALOG,'.', C.TABLE_SCHEMA,'.', C.TABLE_NAME) AS EMPTY_TABLE
ИЗ sys.tables t
присоединиться к sys.schemas s (t.schema_id = s.schema_id)
присоединиться к sys.partitions p (t.object_id = p.object_id)
присоединиться к INFORMATION_SCHEMA.COLUMNS c (s.name=c.TABLE_SCHEMA и t.name=c.TABLE_NAME)
ГДЕ p.index_id в (0,1)
СГРУППИРОВАТЬ ПО C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME
СУММА (p.rows) = 0)
AND CONCAT(TABLE_CATALOG,'.', TABLE_SCHEMA,'.', TABLE_NAME) NOT IN --Black List Tables
('DWH_PROD.dbo._tmp_retro')
СГРУППИРОВАТЬ ПО ТАБЛИЦЕ_КАТАЛОГУ, ТАБЛИЦЕ_СХЕМА, ТАБЛИЦА_ИМЯ) T )
ПОКА @TableI<=@TableCount
НАЧИНАТЬ
УСТАНОВИТЬ @TableIN=CAST(@TableI КАК NVARCHAR(MAX))
УСТАНОВИТЬ @SourceTableSql=
'SELECT @SourceTableTemp=CONCAT(TABLE_CATALOG,''.'',TABLE_SCHEMA,''.'',TABLE_NAME)
ОТ
(ВЫБЕРИТЕ TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,COUNT(*) AS COLUMN_CNT,
ROW_NUMBER() OVER (ORDER BY TABLE_NAME) AS DUM_TABLE_POSITION
ИЗ INFORMATION_SCHEMA. COLUMNS
WHERE CONCAT(TABLE_CATALOG,''.'', TABLE_SCHEMA,''.'', TABLE_NAME) NOT IN --Имеет хотя бы один столбец Geography Data_Type
(ВЫБЕРИТЕ CONCAT(C.TABLE_CATALOG,''.'', C.TABLE_SCHEMA,''.'', C.TABLE_NAME) AS TABLE_HAS_GEOGRAPHY_DATA_TYPE
ИЗ INFORMATION_SCHEMA.COLUMNS C
ГДЕ DATA_TYPE=''География'')
AND CONCAT(TABLE_CATALOG,''.'', TABLE_SCHEMA,''.'', TABLE_NAME) NOT IN --Eliminate Empty Tables
(ВЫБЕРИТЕ CONCAT(C.TABLE_CATALOG,''.'', C.TABLE_SCHEMA,''.'', C.TABLE_NAME) AS EMPTY_TABLE
ИЗ sys.tables t
присоединиться к sys.schemas s (t.schema_id = s.schema_id)
присоединиться к sys.partitions p (t.object_id = p.object_id)
присоединиться к INFORMATION_SCHEMA.COLUMNS c (s.name=c.TABLE_SCHEMA и t.name=c.TABLE_NAME)
ГДЕ p.index_id в (0,1)
СГРУППИРОВАТЬ ПО C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME
СУММА (p.rows) = 0)
AND CONCAT(TABLE_CATALOG,''.'', TABLE_SCHEMA,''.'', TABLE_NAME) NOT IN --Black List Tables
(''DWH_PROD.dbo._tmp_retro'')
СГРУППИРОВАТЬ ПО TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME) K
ГДЕ DUM_TABLE_POSITION=@TableIN'
EXECUTE sp_executesql @SourceTableSql, N'@TableIN NVARCHAR(MAX),@SourceTableTemp NVARCHAR(MAX) OUTPUT',
@TableIN=@TableIN, @SourceTableTemp = @SourceTableName ВЫВОД
УДАЛИТЬ #HamdullahUstadKacincidir2
SET @SourceTableSql22 = 'ВСТАВИТЬ В #HamdullahUstadKacincidir2
ВЫБИРАТЬ *
ИЗ ( ВЫБРАТЬ A. AAA,C.*
FROM ( SELECT TOP '+CONCAT('',@SampleSize)+' AAA = CONCAT(''SAMPLE_'', ROW_NUMBER() OVER( ORDER BY (SELECT 1)) ),*
FROM '+@SourceTableName+' SRC ) A
ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ ( ЗНАЧЕНИЯ ((Выберите A.* FOR XML RAW, Type)) B(XMLData)
CROSS APPLY ( SELECT COLUMN_NAME = xAttr.value(''local-name(.)'', ''VARCHAR(MAX)''),VALUE = xAttr.value(''.'',''VARCHAR(MAX)' ')
ИЗ XMLData.nodes(''//@*'') xNode(xAttr)
ГДЕ xAttr.value(''local-name(.)'', ''varchar(100)'') не в (''AAA'')) C ) SRC
PIVOT (MAX(VALUE) FOR [AAA] IN (' + STUFF((SELECT TOP (@SampleSize) ','+CONCAT('SAMPLE_', ROW_NUMBER() OVER( ORDER BY (SELECT 1))
FROM master..spt_values ​​FOR XML Path('')),1,1,'') + ')) ) P'
ВЫПОЛНИТЬ(@SourceTableSql22)
ВСТАВЬТЕ В #HamdullahUstadKacincidir
ВЫБЕРИТЕ TABLE_NAME=@SourceTableName,* FROM #HamdullahUstadKacincidir2
УСТАНОВИТЬ @TableI=@TableI+1
КОНЕЦ
ВЫБЕРИТЕ E.*,K.*,H.*
ОТ
(ВЫБЕРИТЕ CONCAT(TABLE_CATALOG,'.',TABLE_SCHEMA,'.',TABLE_NAME) AS TABLE_NAME,COLUMN_NAME,DATA_TYPE,
ROW_NUMBER() OVER (PARTITION BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME ORDER BY ORDINAL_POSITION ) AS COLUMN_POSITION
ИЗ INFORMATION_SCHEMA. COLUMNS
) К
ЛЕВОЕ СОЕДИНЕНИЕ
#HamdullahUstadKacincidir H
ON K.TABLE_NAME COLLATE DATABASE_DEFAULT=H.TABLE_NAME COLLATE DATABASE_DEFAULT
AND K.COLUMN_NAME COLLATE DATABASE_DEFAULT=H.COLUMN_NAME COLLATE DATABASE_DEFAULT
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБЕРИТЕ CONCAT(C.TABLE_CATALOG,'.', C.TABLE_SCHEMA,'.', C.TABLE_NAME) AS EMPTY_TABLE
ИЗ sys.tables t
присоединиться к sys.schemas s (t.schema_id = s.schema_id)
присоединиться к sys.partitions p (t.object_id = p.object_id)
присоединиться к INFORMATION_SCHEMA.COLUMNS c (s.name=c.TABLE_SCHEMA и t.name=c.TABLE_NAME)
ГДЕ p.index_id в (0,1)
СГРУППИРОВАТЬ ПО C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME
СУММА (p.rows) = 0) E
ON K.TABLE_NAME=EMPTY_TABLE
ЗАКАЗ ПО K.TABLE_NAME,K.COLUMN_POSITION
 

sql server — транспонирование столбцов таблицы SQL в строки с подсчетом в каждой категории

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

спросил

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

Просмотрено
428 раз

У меня есть таблица с 12 000 строк данных. Таблица состоит из 7 столбцов данных (PIDA, NIDA, SIDA, IIPA, RPRP, IORS, DDSN), каждый столбец с 4 типами записей («Поддерживается», «Не поддерживается», «Не каталогизированный» или «Нулевой»)

 +--------------+-----------+--------------+----- ------+
| ПИДА | НИДА | СИДА | IIPA |
+--------------+-----------+--------------+------- ----+
| Нуль | Поддерживается | Нуль | Нуль |
| Некаталогизированный | Поддерживается | Нуль | Нуль |
| Поддерживается | Поддерживается | Некаталогизированный | Поддерживается |
| Поддерживается | Нуль | Некаталогизированный | Нуль |
+--------------+-----------+--------------+------- ----+
 

Я хотел бы создать вывод, в котором каждая запись подсчитывается для каждого столбца. Как транспонировать столбец в строку.

 +---------------+------+------+------+------+
| Категории | ПИДА | НИДА | СИДА | IIPA |
+---------------+------+------+------+------+
| Поддерживается | 10 | 20 | 50 | 1 |
| Не поддерживается | 30 | 50 | 22 | 5 |
| Некаталогизированный | 5 | 10 | 22 | 22 |
| НУЛЕВОЙ | 10 | 11 | 22 | 22 |
+---------------+------+------+------+------+
 

Не повезло со встроенными операторами select или case. У меня есть ощущение, что нужно немного и того, и другого, чтобы сначала подсчитать, а затем перечислить каждую строку в выводе

Всем спасибо,

  • sql
  • sql-server
  • select
  • count
  • transpose

1

Один из вариантов: UNPIVOT ваши данные, а затем PIVOT результаты

Пример

 Выберите *
 От  (
        Выберите Б.*
         Из вашей таблицы А
         Перекрестное применение (значения (PIDA,'PIDA',1)
                             ,(НИДА,'НИДА',1)
                             ,(СИДА,'СИДА',1)
                             ,(IIPA,'IIPA',1)
                     ) B(Категории,Элемент,Значение)
       ) источник
 Pivot (sum(Value) for Item in ([PIDA],[NIDA],[SIDA],[IIPA])) pvt
 

Результаты (с небольшим размером выборки)

 Категории PIDA NIDA SIDA IIPA
ПУСТО 1 1 2 3
Поддерживается 2 3 NULL 1
Некаталогизированный 1 NULL 2 NULL
 

3

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

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

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

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

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

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

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

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

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

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

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