sudevsu Ответов: 1

Sql-запрос с регистром и объединением на основе имени столбца/ не значения столбца


Здравствуйте эксперты,

У меня есть таблица под названием TABLEA, как показано ниже

ID Name	YTDLVL1	YTDLVL2	YTDLVL3	QLVL1MT	QLVL1SC	QLVL1SP	QLVL2MT	QLVL2SC	QLVL2SP	QLVL2EN
1 John	100	60	90	85				20		
1 John	100	60	90		79					90
1 John	100	60	90			55			66	



Теперь я пытаюсь вставить значения в таблицу 2 с помощью sql-запроса, который дает результат, как показано ниже

ID      NAME	Program	Category Marks
1	John	LVL1	YTD	100
1	John	LVL1	MT	85
1	John	LVL1	SC	79
1	John	LVL1	SP	55
1	John	LVL2	YTD	60
1	John	LVL2	MT	
1	John	LVL2	SC	20
1	John	LVL2	SP	66
1	John	LVL2	EN	90
1	John	LVL3	YTD	85


Что я уже пробовал:

Я использовал оператор case, но case проверяет значение в столбце, а не имя столбца.
Когда имя столбца = "QLVL1MT", я хочу вставить два значения, например Program как LVL1 и Category как MT (математика)
Я искал по всему интернету, но не смог найти ни одного ресурса, который делает такую работу. если значение столбца равно нулю, то оно должно быть введено как "0".

Любая помощь очень ценится.

Suvendu Shekhar Giri

Итак, где же запрос?

1 Ответов

Рейтинг:
2

Maciej Los

Вам нужно оператор UNPIVOT[^] данные!

Проверить это:

DECLARE @tablea TABLE(
	ID INT, [Name] VARCHAR(30),
	YTDLVL1 INT, YTDLVL2 INT, 
	YTDLVL3 INT, QLVL1MT INT, 
	QLVL1SC INT, QLVL1SP INT, 
	QLVL2MT INT, QLVL2SC INT, 
	QLVL2SP INT, QLVL2EN INT)

INSERT INTO @tablea (ID, [Name], YTDLVL1, YTDLVL2, YTDLVL3, QLVL1MT, QLVL1SC, QLVL1SP, QLVL2MT, QLVL2SC, QLVL2SP, QLVL2EN)
VALUES(1, 'John', 100, 60, 90, 85, NULL, NULL, NULL, NULL, 20, NULL),
(1, 'John', 100, 60, 90, 79, NULL, NULL, NULL, NULL, 90, NULL),
(1, 'John', 100, 60, 90, NULL, NULL, 55, NULL, 66, NULL, NULL)


SELECT ID, [NAME], CASE
		WHEN Program Like '%[1]%' THEN 'LVL1'
		WHEN Program Like '%[2]%' THEN 'LVL2'
		WHEN Program Like '%[3]%' THEN 'LVL3'
		END AS Program,
	 CASE
		WHEN Program Like 'YTD%' THEN 'YTD'
		WHEN Program Like '%MT' THEN 'MT'
		WHEN Program Like '%SP' THEN 'SP'
		WHEN Program Like '%SC' THEN 'SC'
		END AS Category, Marks
FROM (
	SELECT *
	FROM @tablea 
	) AS a
UNPIVOT (Marks FOR Program IN (YTDLVL1, YTDLVL2, YTDLVL3, QLVL1MT, QLVL1SC, QLVL1SP, QLVL2MT, QLVL2SC, QLVL2SP, QLVL2EN)) AS unpvt


Результат:
ID	NAME	Program	Category	Marks
1	John	LVL1	YTD			100
1	John	LVL2	YTD			60
1	John	LVL3	YTD			90
1	John	LVL1	MT			85
1	John	LVL2	SP			20
1	John	LVL1	YTD			100
1	John	LVL2	YTD			60
1	John	LVL3	YTD			90
1	John	LVL1	MT			79
1	John	LVL2	SP			90
1	John	LVL1	YTD			100
1	John	LVL2	YTD			60
1	John	LVL3	YTD			90
1	John	LVL1	SP			55
1	John	LVL2	SC			66


Я надеюсь, что это то, чего вы хотели достичь.

Для получения более подробной информации, пожалуйста, смотрите: Преобразование Отмены Свертывания [^]


sudevsu

Спасибо Мацей. Я действительно прогнал ваши три утверждения, прежде чем проверить их в своем запросе. Но я получаю ошибку, как будто столбец программы не найден, метки не найдены. Это означает, что оператор create the table and insert не имеет этих столбцов правильно!? Я говорю об этих

ДЕЛО
Когда программа типа " %[1]%", то "LVL1"
Когда программа типа " %[2]%", то "LVL2"
Когда программа типа " %[3]%", то "LVL3"
Конец как программа,
ДЕЛО
Когда программа типа " YTD%", то "YTD"
Когда программа типа "%MT", то "MT"
Когда программа типа "%SP", то "SP"
Когда программа типа "%SC", то "SC"
Конец как категория,

в вашем выборе.

sudevsu

Спасибо Мацей ... Это помогло после того, как я поработал над ним некоторое время. Спасибо за руководство

Maciej Los

Всегда пожалуйста. Можете ли вы принять мой ответ как решение (зеленая кнопка) - формально, чтобы удалить ваш вопрос из списка без ответа.