首页 > 解决方案 > 将 SQL 中的同一张表与具有公共链接的不同行连接到该特定链接/属性的单行中?

问题描述

我正在使用的查询是

DECLARE @table1 TABLE(tagName nvarchar(256), vvalue Float, lineName nvarchar(10), area nvarchar (8), areaDesc nvarchar(8), euKey int, unit nvarchar (32)) 
DECLARE @finalTable TABLE(tagNameF nvarchar(256), areaF nvarchar (8), areaDescF nvarchar(8), lineNameF nvarchar(10), levelF Float, unitLevelF nvarchar (32), temprF float, unitemprF nvarchar (32)  ) 
INSERT @table1
(
    tagName,
    vvalue,
    lineName,
    area,
    areaDesc,
    euKey,
    unit
)
VALUES
('T1S02C01TT01.PV', '3.99848079681396', 'T1S02C01', 'T1S02',    Null,   '52',   '°C'), ('T1S02C01LT01.PV',  '3956.4545',    'T1S02C01', 'T1S02',    Null,   '34',   'kg'),  
('J1S02C01TT01.PV', '5.99848',  'J1S02C01', 'J1S02',    Null,   '52',   '°C'), ('J1S02C01LT01.PV',  '59984.78778',  'J1S02C01', 'J1S02',    Null,   '32',   '°Ltr'),
('N1N03C01LT01.PV', '35678.99848',  'N1N03C01', 'N1N03',    Null,   '34',   'Kg')

UPDATE @table1
SET

    lineName = SUBSTRING(tagName,1,8),
    area = SUBSTRING(tagName, 1,5)
    FROM @table1    

UPDATE @table1
SET
areaDesc =  CASE    
    
    WHEN    area = 'T1S02' then 'LCT'
    WHEN    area = 'J1S02' then 'ZCT'
    WHEN    area = 'N1N03' then 'Bulk'
    END 
    FROM @table1
    SELECT * FROM @table1 

    Insert into @finalTable 
SELECT  
         tr2.tagName as tagNameF
        ,tr2.area AS  areaF
        ,tr2.areaDesc AS areaDescF
        ,tr2.lineName As lineNameF
        ,tr2.vvalue AS  levelF 
        ,tr2.unit AS    unitLevelF
        ,tr3.vvalue AS temprF
        ,tr3.unit   AS  unitTemprF
          
FROM @table1 tr2
INNER JOIN  @table1 tr3 ON tr2.lineName = tr3.lineName  AND tr2.tagName <> tr3.tagName 
SELECT * FROM @finalTable 
order by lineNameF 

table1 是一个示例表(通过查询创建)。

finalTable 是以所需格式的查询的最终结果。问题是 finalTable 中的第 1 行和第 3 行是错误的,第 5 行(表 1 中缺少)。

如果我使用左连接,那么第 5 行将出现在 finalTable 中。不过,第 1 行和第 3 行不是必需的。

目的是以一种方式加入,即来自 'vvalue' 的值的单位为 'kg' 和 'Ltr'(来自 table1)应该出现在列 'levelF 和 'unitlevelF' 中,反之亦然。结果应该类似于 EndTable:

茶几

你能指导一下吗?

表格1

决赛桌

标签: sqlsql-server

解决方案


我发现很难理解你在追求什么。从图像看起来您有一个键/值表,并且您想要选择数据以便并排显示两个属性。第一个属性是体积或重量(两者都适用),第二个是温度。温度是可选的。

但是,对于键/值表,表中的列非常多。这意味着您的数据库未正确规范化或键是复合键。

让我们假设后者(尽管这不太可能,您可能会考虑更改数据模型)。tagname+ linename+ area+areadesc是某事的关键,例如产品。并且您希望每个此类产品都有一个结果行。单位由eukey+的组合标识unit,您正在寻找 52/'°C' 和 34/'kg' 和 32/'°Ltr'。您的数据库以某种方式确保产品只能具有 34/'kg' 或 32/'°Ltr'。

查询键/值表的典型方法是通过条件聚合:

select
  tagname, linename, area, areadesc,
  max(case when eukey in (32,34) then vvalue end) as levelf,
  max(case when eukey in (32,34) then unit end) as unitlevelf,
  max(case when eukey = 52 then vvalue end) as tempf,
  max(case when eukey = 52 then unit end) as unittempf
from mytable
where (eukey = 32 and unit = '°Ltr')
   or (eukey = 34 and unit = 'kg')
   or (eukey = 52 and unit = '°C')
group by tagname, linename, area, areadesc
order by tagname, linename, area, areadesc;

您可能需要根据自己的需要进行调整。


推荐阅读