Sql 如何查询';转置';具有复杂约束的表
我有下表Sql 如何查询';转置';具有复杂约束的表,sql,Sql,我有下表 table1 id name value ----------------------- 1 n1 v11 1 n2 v12 1 ... ... 1 nm v1m 2 n1 v21 2 n2 v22 2 ... ... 2 nm v2m ... .
table1
id name value
-----------------------
1 n1 v11
1 n2 v12
1 ... ...
1 nm v1m
2 n1 v21
2 n2 v22
2 ... ...
2 nm v2m
...
...
k n1 vk1
k n2 vk2
k ... ...
k nm vkm
在此表中,每个id必须具有相同的名称集,尽管我们不知道它们在读取表时是什么
我想得到所有具有以下约束的ID
1) 如果名称=ni,则值=42
2) 如果name=nj,那么value=24
如果上表是按如下方式编写的,那么我们可以这样做
select id from table2 where ni = 42 and nj = 24
table2
id n1 n2 ... nm
---------------------------
1 v11 v12 ... v1m
2 v21 v22 ... v2m
...
k vk1 vk2 ... vkm
但在最初的表1中,我不确定这样做的最佳方式是什么。
对于这个约束,可能会有一个临时查询。但是,如果约束更复杂,如
n1!=19或否(n2=55和n3=44)
我找不到一个普遍的解决办法
我可以将表1定义为表2。但是为了给表2添加一个新名称,我们必须通过添加一个新列来改变表2的设计。。。有没有更好的解决办法?谢谢。您甚至不需要
表2
,因为它可以使用透视查询从表1
生成:
SELECT id,
MAX(CASE WHEN name = 'n1' THEN value END) AS n1,
MAX(CASE WHEN name = 'n2' THEN value END) AS n2,
...
MAX(CASE WHEN name = 'nm' THEN value END) AS nm
FROM table1
GROUP BY id
Biegeisen:group by和max的有趣用法!“查询计划”还表明此查询也是有效的。谢谢。@JoeC如果您需要更改值,只需在
table1
中进行更改,然后使用我的查询将table2
导出即可。