Свод не дает ожидаемого результата

#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 *