【问题标题】:SQL convert rows to columns and flattenSQL 将行转换为列并展平
【发布时间】:2021-06-25 01:35:54
【问题描述】:

我一直在 PIVOT、UNPIVOT 等中寻找解决方案,但仍然没有看到我的方案。我的桌子上有物品。为简单起见,我们只说 PartNum, Desc。这些东西可以定制。颜色、高度、宽度、深度等属性存储在一个单独的表中,并带有一个代码来指示哪个属性。

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 中。有人可以帮忙吗?

【问题讨论】:

  • 那么Area从何而来?
  • case expression 不是 statement :)
  • @GordonLinoff 面积的计算并不是问题的重点。这是如何将行放入列并将它们展平。
  • @DaleK w3schools.com/sql/sql_case.asp 案例陈述
  • @HeyMikey w3schools 完全错误,请参阅Official Documentation

标签: sql sql-server flatten sql-server-2019


【解决方案1】:

这是你想要的吗?

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 是一个 dbfiddle。

【讨论】:

  • 我猜(宽 * 高 * 计数)= 面积
  • 这并不能真正实现我正在寻找的东西,因为长度、宽度和深度是所有它们的总和,而不是实际值。当我在样本数据上运行它时,我在第 3 行得到 20 x 40 而不是 10 x 20。 (顺便说一句,面积是表面积而不是体积,因此不包括深度)。呈现给用户的值应该是每个的大小和数量,即 1 @ 10 x 10, 1 @ 12 x 10, 2 @ 10 x 20
  • @HeyMikey 。 . .结果集中没有 20x40。我已经证明它适用于您的示例数据——好吧,除了area,您的问题中没有解释。
  • 你是对的。我刚才有一个灵光乍现的时刻。我没有在内部选择上分组。这完美地工作。我刚刚注意到我在第二行的拼写错误,区域 s/b 12x10 =120。
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
相关资源
最近更新 更多