#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
Я использую pivot и unpivot, но я не получаю ожидаемый результат
Вот мой пример набора данных
Таблица 1
id c_code
-----------------
123 1
456 1
Таблица 2
id c_code i_t_code i_code
----------------------
123 1 TWinc 10
123 1 TBinc 20
123 1 TSinc 30
Таблица 3
i_code i_t_code i_name
------------------------------
10 TWinc abc
20 TBinc xyz
30 TSinc pqr
Вот мой запрос
Запрос
select * from (
select id,inc,i_t_code from (
select a.id,b.i_name,cast(b.i_code AS
VARCHAR(128)) as i_code,b.i_t_code
from
table_1 a
join
table_2 b
on a.id= b.id
and
a.c_code = b.c_code
join
tabl_3 c on c.i_code = b.i_code
and
c.i_t_code = b.i_t_code
on a.i_code = b.i_code
) d
Unpivot
(
inc for details in (i_name,i_code)
) as unpt) as uppt_res
PIVOT
(
max(inc)
FOR [i_t_code] IN ([TWinc],[TBinc],[TSinc])
) AS P
Ожидаемый результат:
id TWinc_n TWinc_c TBinc_n TBinc_c TSinc_n TSinc_c
------------------------------------------------------------
123 abc 10 xyz 20 pqr 30
Фактический результат:
id TWinc TBinc TSinc
------------------------------------
123 abc xyz pqr
Как это можно сделать??
Это возможно с помощью pivot или любого другого решения, которое есть
кто-нибудь может помочь это исправить?
Комментарии:
1. Пожалуйста, покажите данные, с которых вы начинаете. И, кхм, MySQL не поддерживает
pivot
, насколько я знаю, поэтому отметьте базу данных, которую вы действительно используете.2. TWinc, TWinc как у вас одинаковое имя столбца
3. Начальные данные очень большие, я показываю результат после отмены, я хочу ответить, как работать с тем же именем столбца в pivot
4. Вам не обязательно показывать весь набор данных, но покажите ту часть набора данных, которая, как вы ожидаете, приведет к вашему целевому результату. И, как указал @ZaynulAbadinTuhin, наличие нескольких столбцов с одинаковым именем проблематично — вот почему SQL Server допускает псевдонимы столбцов.
5. Зачем вам нужны два столбца с одинаковым именем? Как вы планируете использовать этот результирующий набор?
Ответ №1:
Вам придется внести в свои данные некоторые изменения, если вы хотите помешать pivot сжимать одинаковые элементы данных вместе при преобразовании данных строки в имена столбцов и выборе max(inc)
— вероятно, проще всего это сделать, изменив содержимое не выделенных данных, указав номер строки:
SELECT * FROM
(
select stoneid, inc, CONCAT(inclusion_type_id, ROW_NUMBER()OVER(PARTITION BY inclusion_type_id ORDER BY inc)) as inclusion_type_id FROM
(
select
a.stoneid,
b.inclusion_name,
cast(b.inclusion_code AS VARCHAR(128)) as inclusion_code,
b.inclusion_type_id,
b.inclusion_type_code
from
PACKET.STONE_LAB_INCLUSIONS a
inner join
MASTER.INCLUSION_MASTER b
on
a.inclusion_code = b.inclusion_code and
a.inclusion_type_code = b.inclusion_type_code
inner join
packet.stone_details c
on
c.stoneid = a.stoneid and
c.certificate_code = a.certificate_code
) d
UNPIVOT(inc for details in (inclusion_name,inclusion_code)) as unpt
) uppt_res
PIVOT
(
MAX(inc)
FOR [inclusion_type_id] IN ([TWinc1],[TWinc2],[TBinc1],[TBinc2],[TSinc1],[TSinc2])
) AS P
Если вы отчаянно хотите, чтобы имена столбцов совпадали, вы можете использовать псевдоним для результатов этого запроса, а не select *