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

时间:2019-01-09 20:18:33

标签: mysql sql ssms

我有一个表Demo1,其中有多个类似的DIM_KEY,分别用于几个不同的ATTR_NAME(属性名)。我想显示一个表,其中包含DIM_KEY,UPC,DAIRY_CLM,KOSHER_CLM,FAT和CALORIES的列,其中匹配值是行。

这是原始表Demo1:[1]:https://imgur.com/a/KqayM1C



这就是我想要的样子(表:Demo2):[2]:https://imgur.com/a/nwpoHhv

我试图将Demo1中的行插入到一个空的Demo2表中,但是并没有达到我想要的效果。我也无法以这种方式获取DIM_KEY。我也尝试使用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;

2 个答案:

答案 0 :(得分:1)

这确实是一个枢轴,也称为交叉表,有时甚至是转置

某些数据库具有专用的功能来执行此操作,而其他数据库则必须使用分组语法。我更喜欢后者,因为它可以通用

如果有什么安慰的话,您真的很亲密!

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_key)中只有一个值,其余均为NULL

添加GROUP BY和MAX会使它们折叠成一行,因为MAX()将仅返回列中的值并使所有空值消失。这是分组的一个固有属性,行数据不会“保持在一起”-在特定DIM_KEY的组内,MAX(DAIRY_CLM)可以来自任何行,MAX(KOSHER_CLM)可以来自任何其他行。实际上,这意味着选择单个值,丢弃空值,它们都出现在同一行。

..因此垂直数据经过对角线后变为水平

答案 1 :(得分:0)

您可以使用(假)聚合函数并按

分组
    sass: {
        prod: {
            options: {
                sourcemap: 'none',
                style: 'compressed',
                unixNewlines: true,
                trace: false,
                loadPath: 'sass',
                quiet: true,
            },
            files: [{
                expand: true,
                cwd: 'static/compass/sass/',
                src: ['**/*.scss'],
                dest: 'static/compass/css/',
                ext: '.css'
            }]
        }
    },

这对于两个数据库都应以相同的方式工作。