簡體   English   中英

使用SQL從行中的值創建列

[英]Create column from values in row using SQL

誰能幫助我使用sql連接兩個表? 連接后,行應顯示為列,如下面的輸出所示。

我有兩個表T1和T2

T1
------------
Id.  Name  date
--------------
1    AAA    2019-05-06
2    BBB    2019-05-06



T2
---------------
Id.  attr_name. attr_value. date
--------------------
1 .   PP0         8       2019-05-06    
1 .   PD0        125.00     2019-05-06
1     PP1         2         2019-05-06
1     PD1        150.00      2019-05-06
3     PP0         5         2019-05-06
3     PD1        50.00      2019-05-06

當有PP0時,會有對應的PD0

My output should be
---------------------
Id    Name       attr_pp_name     attr_pp_value.  attr_pd_name     attr_pd_value
1     AAA          PP0                  8               PD0          125.00
1.    AAA          PP1                  2               PD1          150.00

我嘗試了如下查詢

select t.Id, t.name ea.attr_name ,ea.attr_value, ea1.attr_name, ea1.attr_value from T1 t
INNER JOIN T2 ea ON t.id = ea.id AND ea.attr_name IN ('PP0', 'PP1')
INNER JOIN T2 ea1 ON t.id = ea.id AND ea.attr_name IN ('PD0', 'PD1');

但是上面的查詢給出了重復的結果為

Id    Name       attr_pp_name     attr_pp_value.  attr_pd_name     attr_pd_value
1     AAA          PP0                  8               PD0          125.00
1.    AAA          PP1                  2               PD1          150.00
1     AAA          PP0                  2               PD1          150.00
1.    AAA          PP1                  8               PD0          125.00

在MySQL 8+中,可以使用窗口函數枚舉屬性值,然后進行聚合:

select t.*,
       max(case when ea.attr_name like 'PP%' then ea.attr_name end),
       max(case when ea.attr_name like 'PP%' then ea.attr_value end),
       max(case when ea.attr_name like 'PD%' then ea.attr_name end),
       max(case when ea.attr_name like 'PD%' then ea.attr_value end)
from T1 t join
     (select ea.*,
             row_number() over (partition by ea.id, left(ea.attr_name, 2) order by ea.id) as seqnum
      from t2 ea
     ) ea
     on ea.id = t.id
group by t.id, ea.seqnum;

編輯:

在較早版本中解決此問題的一種方法是使用變量:

select t.*,
       max(case when ea.attr_name like 'PP%' then ea.attr_name end),
       max(case when ea.attr_name like 'PP%' then ea.attr_value end),
       max(case when ea.attr_name like 'PD%' then ea.attr_name end),
       max(case when ea.attr_name like 'PD%' then ea.attr_value end)
from T1 t join
     (select ea.*,
             (@rn := if(@ida = concat_ws(':', ea.id, left(ea.attr_name, 2)), @rn + 1,
                        if(@ida := concat_ws(':', ea.id, left(ea.attr_name, 2)), 1, 1)
                       )
             ) as seqnum
      from (select ea.*
            from t2 ea
            order by ea.id, left(ea.attr_name, 2)
           ) ea cross join
           (select @ida := '', @rn := 0) params
     ) ea
     on ea.id = t.id
group by t.id, ea.seqnum;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM