我有一个表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;
答案 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'
}]
}
},
这对于两个数据库都应以相同的方式工作。