3
A
回答
0
一个想法是使用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 Fiddle。
祝你好运。
10
我认为这样做最简单的方法是通过应用两个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
由此也可以使用UNION ALL
作为逆透视和骨料功能和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) |
相关问题
- 1. 如何分组来自不同列的值sql
- 2. 如何将行值分组为列?
- 3. 将键值列分组为一行
- 4. 如何将来自两个不同散列数组的值添加到一起?
- 5. 将组合列值分解为不同的行
- 6. 如何将来自不同来源的通知分组到一个模型中
- 7. 如何附加来自同一列的不同值?
- 8. 如何根据列的唯一值对列进行分组并根据其值来计入不同的列?
- 9. 如何在列中分组行值并将行转换为列?
- 10. 如何不同值分配给一个列不同行
- 11. 如何将数组值分为3列?
- 12. 如何根据按不同对分组的列值来选择行?
- 13. 如何将多行分组为一行?
- 14. 合并来自不同行的布尔结果分为单列
- 15. 如何根据2个不同的列值将一行分成两部分
- 16. 如何仅将JSON文档分组为不同的值?
- 17. 如何将行分组为具有多个值的列?
- 18. 如何将同一列中的不同值组合到一列中?
- 19. 显示来自不同行的多个值与同一列中的值
- 20. 如何将一行中的多个值拆分为不同的行?
- 21. 如果列值来自不同的文件,如何将列插入数据框?
- 22. MYSQL来自同一列中选择多个值作为行
- 23. 将列值限制为同一个表内不同列的值?
- 24. 将来自不同表格的行值合并到一列中。 [SQL]
- 25. MySQL查询将值分配给来自不同列的相同变量
- 26. 使用PHP将来自CSV的数组的不同部分组合在一起?
- 27. 如何将行拆分为Spark DataFrame/DataSet中的不同列?
- 28. PHP MySQL将来自不同行的单元格的值相同
- 29. (JasperReports)将来自不同数据源的数据组合为同一报告行的列
- 30. 将SQL分组为一列中逗号分隔的值列表
是什么让你把BCDE0010放在第一排和第二排? –
哪个数据库 - SQL Server,MySQL,Oracle? – sgeddes
您正在尝试的操作称为数据透视表。尝试在“数据透视表”上进行谷歌搜索 – DwB