【问题标题】:Multiple rows with same fk to columns具有相同 fk 到列的多行
【发布时间】:2020-09-11 06:44:10
【问题描述】:

我需要编写一个 t-sql 查询来转换、转置数据集,无论使用什么正确的术语,如下所示。

Table a
ID, CategoryID, Col1, Col2, Col3, Col4, Col5, Col6
1,     1,       val1, val2, val3, val4, val5, val6
2,     1,       val1, val2, val3, val4, val5, val6
3,     1,       val1, val2, val3, val4, val5, val6
4,     2,       val1, val2, val3, val4, val5, val6
5,     2,       val1, val2, val3, val4, val5, val6
6,     2,       val1, val2, val3, val4, val5, val6

到

CategoryID, Col1, Col2, Col3, Col4, Col5, Col6, Col1, Col2, Col3, Col4, Col5, Col6, Col1, Col2, Col3, Col4, Col5, Col6
1, val1, val2, val3, val4, val5, val6, val1, val2, val3, val4, val5, val6, val1, val2, val3, val4, val5, val6
2, val1, val2, val3, val4, val5, val6, val1, val2, val3, val4, val5, val6, val1, val2, val3, val4, val5, val6

因此,对于表中的每个 categoryId,获取所有列。 以 categoryId 为主键创建行,并将所有列值一个接一个地放置

【问题讨论】:

标签: sql sql-server tsql group-by pivot


【解决方案1】:

如果您事先知道每个类别的最大行数,一个选项使用row_number() 和条件聚合。

这里是如何为每个类别三个可能的行的三列执行此操作

select
    categoryID,
    max(case when rn = 1 then col1 end) col1_1,
    max(case when rn = 1 then col2 end) col2_1,
    max(case when rn = 1 then col3 end) col3_1,
    max(case when rn = 2 then col1 end) col1_2,
    max(case when rn = 2 then col2 end) col2_2,
    max(case when rn = 2 then col3 end) col3_2,
    max(case when rn = 3 then col1 end) col1_3,
    max(case when rn = 3 then col2 end) col2_3,
    max(case when rn = 3 then col3 end) col3_3
from (
    select t.*, row_number() over(partition by categoryID order by id) rn
    from mytable t
) t
group by categoryID

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2021-09-21
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多