我有一个TSQL表,其中包含许多列,我想重点关注“ RegID”,“配置”和“值”。多个“配置”可以包含一个“ RegID”,对于给定的“配置” +“ RegID”组合,仅存在一个“值”。
我想查询一个显示“ RegID”行和“配置”列的表,其中列出了每个“ RegID”和“配置”(如果有)的“值”。
我试图通过以下查询解决它,但是手动添加所有配置只是感觉不对。最多可以有9种配置。
SELECT DISTINCT sp.RegID,
(
SELECT sp1.Value
FROM StandardParameters sp1
WHERE sp.RegID = sp1.RegID
AND sp1.Configuration = 'conf1'
) AS Conf1,
(
SELECT sp1.Value
FROM StandardParameters sp1
WHERE sp.RegID = sp1.RegID
AND sp1.Configuration = 'conf2'
) as Conf2
FROM StandardParameters sp
关于如何优化此设置的任何想法,这样我就不必手动列出所有配置了?我感觉自己缺少明显的东西。可能与分组依据有关,但是我不知道如何将分组值作为列。 :-)
Sample Data
RegID Configuration Value
reg1 conf1 1
reg2 conf1 2
reg1 conf2 3
reg3 conf2 4
Desired Output
conf1 conf2
reg1 1 3
reg2 2 NULL
reg3 NULL 4
答案 0 :(得分:1)
您可以使用case statement
处理此问题。由于只有9种配置,因此您可以对其进行硬编码。
select distinct sp.RegID,
case when sp.Configuration = 'conf1' then sp1.Value end conf1,
case when sp.Configuration = 'conf2' then sp1.Value end conf2
from StandardParameters sp
样本数据和所需结果将有助于了解确切的需求。
答案 1 :(得分:1)
我认为您可以使用2种方式
-- with GROUP BY
SELECT
RegID,
MIN(CASE WHEN Configuration='conf1' THEN Value END) conf1,
MIN(CASE WHEN Configuration='conf2' THEN Value END) conf2
FROM StandardParameters
GROUP BY RegID
-- wiht PIVOT
SELECT *
FROM StandardParameters PIVOT(MIN(Value) FOR Configuration IN([conf1],[conf2])) p