将具有相同id的行组转置到另一个表中

nc1teljy  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(306)

我有一个表demo1,其中有多个类似的dim\u键,用于几个不同的属性名(属性名)。我想显示一个表,其中包含dim\u key、upc、dairy\u clm、kosher\u clm、fat和carolis列,匹配的值是行。
这是原始表demo1:[1]:https://imgur.com/a/kqaym1c
这就是我想要的样子(表:demo2):[2]:https://imgur.com/a/nwpohhv
我尝试过将demo1中的行插入到一个空的demo2表中,但结果并不是我想要的那样。我也不能用那种方式得到暗号。我也尝试过使用pivot,但只得到了错误。我正在使用mysql,但这也需要在ssms中工作。如果我必须选一个的话,我会选择ssms。

INSERT INTO Demo2 (UPC, DAIRY_CLM, KOSHER_CLM, FAT, CALORIES)
SELECT
    (CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM Demo1;
hiz5n14c

hiz5n14c1#

您可以使用(假)聚合函数和分组方式

INSERT INTO Demo2 (UPC, DAIRY_CLM, KOSHER_CLM, FAT, CALORIES)
SELECT min(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) ,
      min(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
     min(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
    min(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
    min(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM Demo1
group by DIM_KEY;

这两个数据库的工作方式应该相同。。

zpjtge22

zpjtge222#

这确实是一个轴心,也被称为交叉表,或有时转置
有些数据库有专门的工具来完成这项工作,有些则必须使用分组语法。我更喜欢后者,因为它普遍适用
如果有什么安慰的话,你真的很接近!

SELECT
    DIM_KEY,
    MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
    MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
    MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
    MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
    MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
FROM demo
GROUP BY DIM_KEY

它是如何工作的?
好吧,如果您运行的是您已经拥有的非分组、无最大函数版本:

SELECT
    DIM_KEY,
    (CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM
   demo

然后你会看到你的数据变成“对角线”:

3005, 123423, null, null...
3005, null,   N,    null...
3005, null,   null, Y   ...

在每列(每个dim\键)中只有一个值,其余为空
在groupby和max中添加会导致它们折叠成一行,因为max()只返回列中的值,并使所有的空值消失。这是分组的一个固有属性,行数据不会“停留在一起”——在特定dim\u键的组中,max(dairy\u clm)可以来自任何行,max(kosher\u clm)可以来自任何其他行。。在实践中,这意味着选取单个值,舍弃空值,它们都出现在同一行上。。
..因此你的垂直数据在穿过对角线之后是水平的

相关问题