在 SQL 中加入两个表、分组和数据透视
Join two tables, group and pivot in SQL
我有两个 table,我想在其中加入两个字段,根据 table 中的某些值创建组,然后执行数据透视。这是我的 tables:
table 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
table2
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 服务器中我会推荐 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)
我有两个 table,我想在其中加入两个字段,根据 table 中的某些值创建组,然后执行数据透视。这是我的 tables:
table 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
table2
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 服务器中我会推荐 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)