Я ищу способ отображать значения одного запроса SQL как имена столбцов в другом операторе SQL. Я вижу в Интернете множество примеров использования сводной или перекрестной таблицы. Я попробовал оба варианта, но так и не смог найти выход. Если кто-нибудь может дать мне подсказку в правильном направлении следующим образом:
Как видите, я хочу добавить в заголовок «Kledingmaat» вместо usr1 и так далее.
Дополнительная информация: у меня есть таблица personen
, в этой таблице 10 столбцов USR1, USR2, USR3, USR4, USR5, USR6, USR7, USR8, USR9, USR10
. Затем у меня есть таблица uservelden
со следующими столбцами:
VOLGNR, USERTABELNAAM, CAPTIONSTRING
Как я могу достичь следующего результата:
Мой SQL:
WITH ColumnNames AS
(
SELECT TOP 10 CAPTIONSTRING, VOLGNR
FROM USERVELDEN
WHERE (USERVELDNAAM LIKE 'USR[1-9]' OR USERVELDNAAM LIKE 'USR[1-9][0-9]')
AND ACCOUNT_ID = 258
AND USERTABELNAAM = 'PERSONEN'
ORDER BY VOLGNR
)
SELECT
MAX(CASE WHEN ColumnNames.VOLGNR = 1 THEN usr1 END) AS 'Kledingmaat',
MAX(CASE WHEN ColumnNames.VOLGNR = 2 THEN usr2 END) AS 'Kledingmaat anders',
MAX(CASE WHEN ColumnNames.VOLGNR = 3 THEN usr3 END) AS 'Dieetwensen',
MAX(CASE WHEN ColumnNames.VOLGNR = 4 THEN usr4 END) AS 'Shoe size',
MAX(CASE WHEN ColumnNames.VOLGNR = 5 THEN usr5 END) AS 'Fifth',
MAX(CASE WHEN ColumnNames.VOLGNR = 6 THEN usr6 END) AS 'Sixth',
MAX(CASE WHEN ColumnNames.VOLGNR = 7 THEN usr7 END) AS 'Seventh',
MAX(CASE WHEN ColumnNames.VOLGNR = 8 THEN usr8 END) AS 'Eighth',
MAX(CASE WHEN ColumnNames.VOLGNR = 9 THEN usr9 END) AS 'Ninth',
MAX(CASE WHEN ColumnNames.VOLGNR = 10 THEN usr10 END) AS 'Tenth'
FROM
PERSONEN
CROSS JOIN
ColumnNames
WHERE
ACCOUNT_ID = 258
AND INACTIEF = 'F';
Изучите создание псевдонимов столбцов с помощью динамического SQL через STUFF.
Ваш вопрос неясен - как связаны эти поля, таблицы? Действительно, прямой ответ на ваш вопрос: select usr1 as Kledingmaat, usr2 as "Kledingmaat anders", usr3 as Dieetwensen, usr4 as "Shoe size" from MyTable
— это все, что вам нужно? Если вы имеете в виду, что вам нужно получить заголовки этих столбцов из другой таблицы, то вам, вероятно, понадобится так называемый «динамический SQL» (и, кстати, вероятно, даже начинать идти по этому пути — плохая идея — вы не эффективно моделируете данные с помощью этого подход).
Да, @topsail, спасибо, что хотя бы попытался мне помочь. Они связаны через account_id = 258 и USERTABELNAAM = 'REL_PERSOON'.
Почему вы делитесь таблицей с такими заголовками, как usr1
, usr2
и т. д., когда в вашей выборке данных/исходной таблице указаны размеры одежды и тому подобное? Это очень запутанный вопрос. Пожалуйста, поделитесь примерными данными и желаемыми результатами этих выборочных данных, чтобы мы могли лучше понять. Также уточните, известны ли вам значения Kledingmaat
, если вы хотите, чтобы сервер динамически определял результаты на основе данных в таблице (так называемый «динамический свод»). Наконец, отредактируйте теги используемой вами СУБД (mysql, postgres, sql-сервер и т. д.).
Usr1, usr2 — это значения, которые необходимо отобразить. Таким образом, usr1 должен отображаться как значение под «kledingmaat». usr2 должен быть показан для «Kledingmaat anders». и поэтому у меня есть 10 пользовательских полей, которые можно заполнить данными. Но на данный момент у меня есть только 4 пользовательских поля, которые фактически заполнены данными. @ДжейНевилл
это пользовательские поля, они предназначены для того, чтобы пользователь мог определить собственное поле. Так что это не «пользователь» @topsail. Извините за плохой английский и недопонимание
возможно, эта рабочий пример поможет нам совместно найти решение dbfiddle.uk/Hy3hlA34
@BartMcEndree Я только что добавил свой SQL-запрос. Я не знаком со скрипкой. Но я постараюсь изо всех сил
@topsail Да, именно так
Пожалуйста, не используйте изображения для данных — используйте уценку таблицы.
Используете идеи из динамического запроса PIVOT SQL Server? Мне удалось создать это решение для динамических столбцов SQL-Server.
Это должно создать @cols = 'usr1 как [Kledinmaat], usr2 как [Kledinmaat anders], usr3 как [Dieetwensen], usr4 как [Размер обуви]'
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',usr' + CAST(Row_Number() OVER (ORDER BY (SELECT NULL)) as Varchar(3)) + ' as '+ QUOTENAME(c.CAPTIONSTRING)
FROM uservelden c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SELECT @cols
set @query = 'SELECT ' + @cols + ' FROM personen '
execute(@query)
Круто, но мне это нужно как один SQL-запрос, который я затем могу использовать в своем XML-файле. Но именно так работает приложение. Я добавил свой текущий sql в приведенный выше пример. Теперь у меня статический sql, он должен быть динамическим
Где твой код! что ты уже испробовал? Stack Overflow не является бесплатным сервисом для написания кода. Предполагается, что вы попытаетесь написать код самостоятельно. После дополнительных исследований если у вас возникла проблема, вы можете опубликовать то, что вы пробовали, с четким объяснением того, что не работает, и предоставить Минимальный, полный и проверяемый пример