[英]How to group by values from different columns into one row?
我有一個源表,看起來像這樣:
如何使結果表看起來像這樣。 我可以在sql或java代碼中使用解決方案。
拜托,任何人都可以幫助我。 謝謝。
我認為最簡單的方法是同時應用UNPIVOT
和PIVOT
函數來獲得結果:
select account, description,
[value_1], [value_2], [value_3], [value_4]
from
(
select account, description, col, value,
row_number() over(partition by account, col order by col) rn
from
(
select [account], [description], [value_1], [value_2], [value_3], [value_4]
from yourtable
) src
unpivot
(
value
for col in ([value_1], [value_2], [value_3], [value_4])
) un
) s
pivot
(
max(value)
for col in ([value_1], [value_2], [value_3], [value_4])
) piv
請參閱SQL Fiddle with Demo 。
這也可以使用UNION ALL
作為unpivot以及聚合函數和CASE
表達式來完成:
select account, description,
max(case when col = 'value_1' then value end) value_1,
max(case when col = 'value_2' then value end) value_2,
max(case when col = 'value_3' then value end) value_3,
max(case when col = 'value_4' then value end) value_4
from
(
select account, description, col, value,
row_number() over(partition by account, col order by account) rn
from
(
select [account], [description], 'value_1' col, [value_1] value
from yourtable
where [value_1] is not null
union all
select [account], [description], 'value_2' col, [value_2] value
from yourtable
where [value_2] is not null
union all
select [account], [description], 'value_3' col, [value_3] value
from yourtable
where [value_3] is not null
union all
select [account], [description], 'value_4' col, [value_4] value
from yourtable
where [value_4] is not null
) s
) un
group by account, description, rn
兩者都給出了結果:
| ACCOUNT | DESCRIPTION | VALUE_1 | VALUE_2 | VALUE_3 | VALUE_4 |
----------------------------------------------------------------------
| A00005 | Account Desc | ABCD0081 | BCDE0010 | BKCP0010 | SMTP0010 |
| A00005 | Account Desc | ABCD0082 | (null) | BKCP0011 | (null) |
一個想法是使用Row_Number()
作為您的加入字段。 像這樣的東西:
SELECT T.Account, T.Description, T1.Value_1, T2.Value_2, T3.Value_3, T4.Value_4
From
(
SELECT Account, Description, Value_1, Value_2, Value_3, Value_4,
Row_number() OVER (ORDER BY (SELECT 0)) rn
FROM YourTable
) T
LEFT JOIN (
SELECT Account, Value_1, Row_number() OVER (ORDER BY (SELECT 0)) rn
FROM YourTable
WHERE Value_1 <> '') T1 ON T.Account = T1.Account AND T.rn = T1.rn
LEFT JOIN (
SELECT Account, Value_2, Row_number() OVER (ORDER BY (SELECT 0)) rn
FROM YourTable
WHERE Value_2 <> ''
) T2 ON T.Account = T2.Account AND T.rn = T2.rn
LEFT JOIN (
SELECT Account, Value_3, Row_number() OVER (ORDER BY (SELECT 0)) rn
FROM YourTable
WHERE Value_3 <> ''
) T3 ON T.Account = T3.Account AND T.rn = T3.rn
LEFT JOIN (
SELECT Account, Value_4, Row_number() OVER (ORDER BY (SELECT 0)) rn
FROM YourTable
WHERE Value_4 <> ''
) T4 ON T.Account = T4.Account AND T.rn = T4.rn
WHERE T1.Value_1 IS NOT NULL
OR T2.VALUE_2 IS NOT NULL
OR T3.VALUE_3 IS NOT NULL
OR T4.VALUE_4 IS NOT NULL
如果您的值存儲為空白,那么這應該有效。 如果它們存儲為NULL,則將<>''替換為IS NOT NULL。
這是一個SQL小提琴 。
祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.