如何查询每个条目值的列

时间:2019-04-16 05:41:18

标签: sql tsql

我有一个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

2 个答案:

答案 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