【问题标题】:Join two tables, group and pivot in SQL在 SQL 中加入两个表、组和透视表
【发布时间】:2021-03-06 11:33:00
【问题描述】:

我有两个表,我想在其中加入两个字段,根据表中的某些值创建组,然后执行数据透视。这是我的表格:

表 1

id  date        Total   avail   
123 9/20/2020   10      2   
133 9/20/2020   20      3   
144 9/20/2020   10      1   
55  9/20/2020   15      5   

表2

id  sku     date
123 Ax-89   9/20/2020
144 At-90   9/20/2020
133 By-25   9/20/2020
55  Bt-20   9/20/2020

期望的结果:

id  date    field   group   pivot   sku
123 9/20/2020   2   group1  avail   Ax-89
123 9/20/2020   8   group1  used    Ax-89
144 9/20/2020   1   group1  avail   At-90
144 9/20/2020   9   group1  used    At-90
133 9/20/2020   3   group2  avail   By-25
133 9/20/2020   7   group2  used    By-25
55  9/20/2020   5   group2  avail   Bt-20
55  9/20/2020   10  group2  used    Bt-20

我在做什么

SELECT table1.id table1.date, table1.total, table1.avail ,
       table2.id, table2.sku, table2.date
FROM   table1
JOIN   table2 ON
table1.date = table2.date
table1.id = table2.id
PIVOT(table1.avail) AS Pivot_table
GROUPBY table2.sku WHERE sku CONTAINS 'Ax', 'At' AS 'Group1' AND
WHERE sku CONTAINS 'By', 'Bt' AS 'Group2'

我还在研究中,欢迎提出任何建议。

【问题讨论】:

    标签: sql sql-server inner-join unpivot lateral-join


    【解决方案1】:

    您想要取消透视。在 SQL Server 中,我会推荐 cross apply:

    select t1.id, t1.date, x.field, x.pivot, t2.sku
    from table1 t1
    inner join table2 t2 on t2.id = t1.id and t1.date = t2.date
    cross apply (values (t1.avail, 'avail'), (t1.total - t1.avail, 'used')) as x(field, pivot)
    

    不清楚您希望列group 使用哪种逻辑(顺便说一句,它是一个语言关键字,因此不是列名的好选择)。根据您的尝试,您似乎想根据 sku 进行分配。如果是这样,请使用case 表达式:

    select t1.id, t1.date, x.field, x.pivot, t2.sku,
        case 
            when t2.sku like 'Ax%' or t2.sku like 'At%' then 'group1'
            when t2.sku like 'By%' or t2.sku like 'Bt%' then 'group2'
        end as grp
    from table1 t1
    inner join table2 t2 on t2.id = t1.id and t1.date = t2.date
    cross apply (values (t1.avail, 'avail'), (t1.total - t1.avail, 'used')) as x(field, pivot)
    

    【讨论】:

    • 好的,谢谢@GMB,我会试试的。即使 x.field 和 x.pivot 不在原始数据集中,我们仍然可以选择它吗?查询是否创建了这些列? (x.field,x.pivot)? - 另外,我将如何指定哪些类别属于哪个组? Group1 = 'At',Group2 = 'By'?谢谢
    • @Lynnette:是的。 cross apply 创建一个派生表,您可以在查询中使用其列。
    • 另外@GMB 我将如何指定哪些类别属于哪个组? Group1 = 'At',Group2 = 'By'?谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多