sql - 将 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:
你能指导一下吗?
解决方案
我发现很难理解你在追求什么。从图像看起来您有一个键/值表,并且您想要选择数据以便并排显示两个属性。第一个属性是体积或重量(两者都适用),第二个是温度。温度是可选的。
但是,对于键/值表,表中的列非常多。这意味着您的数据库未正确规范化或键是复合键。
让我们假设后者(尽管这不太可能,您可能会考虑更改数据模型)。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;
您可能需要根据自己的需要进行调整。
推荐阅读
- amazon-web-services - AWS Lambda 是否严格按顺序处理 DynamoDB 流事件?
- jetty - Jetty websockets 和 abstracthandler
- microsoft-graph-api - Office365 API 没有说明日历是否在用户视图中被选中/启用/可见?
- angular - Angular 4 将服务响应值传递给多个组件
- javascript - 使用快捷键在angular6中聚焦可编辑项目的方法是什么?
- c# - 如何在运行时摆脱 DataGridView 行中的这一设计时行?
- c# - 给定 CEST(德国)中的 DateTime,需要知道 EST 时间(包括 DST)
- swift - 从 URL 对 UIImage 进行单元测试
- docopt - 在 docopt 中指定一个选项一次或多次
- python - 如何让笔记本输出始终采用单元格格式以便于粘贴 Excel?