将 SQL 行数据转置为列
Posted
技术标签:
【中文标题】将 SQL 行数据转置为列【英文标题】:Transposing SQL rows data to column 【发布时间】:2020-06-18 15:27:03 【问题描述】:在 SQL 中,我们需要按以下方式转换表:
表1:
+-----+---------+-----------+
| ID | insured | DOD |
+-----+---------+-----------+
| 123 | Pam | 6/18/2013 |
| 123 | Nam | 2/12/2010 |
| 123 | Tam | 2/10/2013 |
| 456 | Jessi | 4/6/2003 |
| 457 | Ron | 4/10/2010 |
| 457 | Tom | 5/5/2008 |
+-----+---------+-----------+
所需的输出表:
+-----+---------+-----------+-----------+-----------+
| ID | insured | DOD1 | DOD2 | DOD3 |
+-----+---------+-----------+-----------+-----------+
| 123 | Pam | 6/18/2013 | 2/12/2010 | 2/10/2013 |
| 456 | Jessi | 4/6/2003 | null | null |
| 457 | Ron | 4/10/2010 | 5/5/2008 | null |
+-----+---------+-----------+-----------+-----------+
我曾在某处看到我们可以使用 pivot 和 unpivot,但我不确定如何在这里使用它。
非常感谢您的帮助。
【问题讨论】:
日期的顺序重要吗?如果是这样,则没有足够的信息来回答您的问题。 感谢您的快速回复@GordonLinoff。是的,DOD1 的日期顺序很重要,输出表中的被保险人是主要被保险人,他们的 DOD 应该在 F 列之后的 G 列中跨度> 【参考方案1】:假设您真的想要 - 或可以接受 - 降序排列的日期,那么您可以为此使用条件聚合:
select id,
max(case when seqnum = 1 then insured end) as insured,
max(case when seqnum = 1 then dod end) as dod_1,
max(case when seqnum = 2 then dod end) as dod_2,
max(case when seqnum = 3 then dod end) as dod_3
from (select t.*,
row_number() over (partition by id order by dod desc) as seqnum
from t
) t
group by id;
如果您想保留原始顺序,那么您的问题没有足够的信息。如果您有一列有排序,则可用于row_number()
。
【讨论】:
【参考方案2】:我会这样运行它,猜测您的 id 是一个数字并且您只想要那些记录。从垂直到水平,枢轴是最好的选择
select id , insured, DOD from yourtable
pivot(max(DOD) for ID in (123,456,457));
【讨论】:
以上是关于将 SQL 行数据转置为列的主要内容,如果未能解决你的问题,请参考以下文章