SQL 将行转换为列并展平
SQL convert rows to columns and flatten
我一直在 PIVOT、UNPIVOT 和其他工具中寻找解决方案,但仍然没有看到我的方案。我在 table 中有项目。为简单起见,我们只说 PartNum, Desc。这些东西可以定制。颜色、高度、宽度、深度等属性存储在单独的 table 中,并使用代码指示哪个属性。
OrderId - PartNum - Desc (join from inv)
1 12345 - Block A
2 12345 - Block A
3 23456 - Block B
4 23456 - Block B
两个客户得到 12345,两个得到 23456,他们有宽度、高度和深度...
AttrId - OrderId - CCode - Value
1 1 WIDTH 10
2 1 HEIGHT 10
3 1 DEPTH 1
4 2 WIDTH 20
5 2 HEIGHT 10
6 2 DEPTH 1
7 3 WIDTH 10
8 3 HEIGHT 20
9 3 DEPTH 2
10 4 WIDTH 10
11 4 HEIGHT 20
12 4 DEPTH 2
我不能将数据透视表与值的聚合一起使用,因为我需要像这样对每个部分、宽度、高度和深度的组合进行分组
PartNum - Width - Height - Depth - Count - Area (w x h x count)
12345 10 10 1 1 100
12345 20 10 1 1 200
23456 10 20 2 2 400
我用 CCode 尝试了 case 语句,但我在某些行中得到了空值,所以分组不起作用。如果有区别的话,这在 SQL Server 2019 中。有人可以帮忙吗?
这是你想要的吗?
select t1.partnum, t2.width, t2.height, t2.depth, count(*) as cnt
from t1 join
(select t2.orderid,
sum(case when ccode = 'width' then value end) as width,
sum(case when ccode = 'height' then value end) as height,
sum(case when ccode = 'depth' then value end) as depth
from t2
group by t2.orderid
) t2
on t2.orderid = t1.orderid
group by t1.partnum, t2.width, t2.height, t2.depth;
我推测你想要:
sum(t2.width * t2.height * t2.depth) as area
但数字与您问题中的值不一致。
Here 是一个 db<>fiddle.
我一直在 PIVOT、UNPIVOT 和其他工具中寻找解决方案,但仍然没有看到我的方案。我在 table 中有项目。为简单起见,我们只说 PartNum, Desc。这些东西可以定制。颜色、高度、宽度、深度等属性存储在单独的 table 中,并使用代码指示哪个属性。
OrderId - PartNum - Desc (join from inv)
1 12345 - Block A
2 12345 - Block A
3 23456 - Block B
4 23456 - Block B
两个客户得到 12345,两个得到 23456,他们有宽度、高度和深度...
AttrId - OrderId - CCode - Value
1 1 WIDTH 10
2 1 HEIGHT 10
3 1 DEPTH 1
4 2 WIDTH 20
5 2 HEIGHT 10
6 2 DEPTH 1
7 3 WIDTH 10
8 3 HEIGHT 20
9 3 DEPTH 2
10 4 WIDTH 10
11 4 HEIGHT 20
12 4 DEPTH 2
我不能将数据透视表与值的聚合一起使用,因为我需要像这样对每个部分、宽度、高度和深度的组合进行分组
PartNum - Width - Height - Depth - Count - Area (w x h x count)
12345 10 10 1 1 100
12345 20 10 1 1 200
23456 10 20 2 2 400
我用 CCode 尝试了 case 语句,但我在某些行中得到了空值,所以分组不起作用。如果有区别的话,这在 SQL Server 2019 中。有人可以帮忙吗?
这是你想要的吗?
select t1.partnum, t2.width, t2.height, t2.depth, count(*) as cnt
from t1 join
(select t2.orderid,
sum(case when ccode = 'width' then value end) as width,
sum(case when ccode = 'height' then value end) as height,
sum(case when ccode = 'depth' then value end) as depth
from t2
group by t2.orderid
) t2
on t2.orderid = t1.orderid
group by t1.partnum, t2.width, t2.height, t2.depth;
我推测你想要:
sum(t2.width * t2.height * t2.depth) as area
但数字与您问题中的值不一致。
Here 是一个 db<>fiddle.