Sql server 回答这个问题,然后接受这个结果并加入上面的讨论。除非我误解了这个问题,否则一旦完成了透视,在上面的透视之后需要做的就是将这两个值连接在一起。是的,我正在做透视,这将使查询更简单。我现在正在尝试查询工作,看看它是否满足结果。Jason,我觉得我们错过了“Ex
Sql server 回答这个问题,然后接受这个结果并加入上面的讨论。除非我误解了这个问题,否则一旦完成了透视,在上面的透视之后需要做的就是将这两个值连接在一起。是的,我正在做透视,这将使查询更简单。我现在正在尝试查询工作,看看它是否满足结果。Jason,我觉得我们错过了“Ex,sql-server,sql-server-2008,pivot,Sql Server,Sql Server 2008,Pivot,回答这个问题,然后接受这个结果并加入上面的讨论。除非我误解了这个问题,否则一旦完成了透视,在上面的透视之后需要做的就是将这两个值连接在一起。是的,我正在做透视,这将使查询更简单。我现在正在尝试查询工作,看看它是否满足结果。Jason,我觉得我们错过了“ExtId”列,它实际上标识了“BP”的组。当存在多个与“BP”相关的数据时,我们必须基于“ExtID”显示这两个数据。我已经更新了导致此查询失败的测试数据。@kuul13这实际上非常有用,因为它提供了一种更直接地连接数据的方法。因此,为了使其工作
回答这个问题,然后接受这个结果并加入上面的讨论。除非我误解了这个问题,否则一旦完成了透视,在上面的透视之后需要做的就是将这两个值连接在一起。是的,我正在做透视,这将使查询更简单。我现在正在尝试查询工作,看看它是否满足结果。Jason,我觉得我们错过了“ExtId”列,它实际上标识了“BP”的组。当存在多个与“BP”相关的数据时,我们必须基于“ExtID”显示这两个数据。我已经更新了导致此查询失败的测试数据。@kuul13这实际上非常有用,因为它提供了一种更直接地连接数据的方法。因此,为了使其工作,您还需要在pivot中提取ExtId,可能是第一列,然后在该ExtId上进行连接。我会更新以反映。让我知道这是否有助于你的结果。我无法更改此设计。许多其他系统/模块正在使用它。您的解决方案似乎很有趣,我需要了解如何在属性表中将硬编码ID更改为您在自连接中拥有的名称(重量、高度)。我无法更改此设计。许多其他系统/模块正在使用它。您的解决方案似乎很有趣,我需要看看如何在属性表中将硬编码的ID更改为自连接中的名称(重量、高度)。使用这种类型的设计没有错,但我看到您当前的实现中存在一些缺陷。你怎么知道
120/80
和126/87
属于同一类?此时,无法将这两条记录绑定到同一行。@bluefeet:实际上有一种方法:您可以按name
对它们进行分区,并按id
排序。但我同意,整个设计可能需要一些简化。@AndriyM问题是,如果数据输入的顺序不同,会怎么样。当前的设计假设它总是以正确的方式输入,你不能依赖它。@BlueFoot,我同意这不是最干净的设计,但这是我现在必须生活的。关于您对如何知道它们在一起的关注,是通过“ExtID”实现的。使用这种类型的设计没有错,但我看到您当前的实现中存在一些缺陷。你怎么知道120/80
和126/87
属于同一类?此时,无法将这两条记录绑定到同一行。@bluefeet:实际上有一种方法:您可以按name
对它们进行分区,并按id
排序。但我同意,整个设计可能需要一些简化。@AndriyM问题是,如果数据输入的顺序不同,会怎么样。当前的设计假设它总是以正确的方式输入,你不能依赖它。@BlueFoot,我同意这不是最干净的设计,但这是我现在必须生活的。关于您对我们如何知道他们在一起的担忧,请使用“ExtID”。
id name
1 weight
2 height
3 bp-systolic
4 bp-diastolic
5 ABI
6 Notes
7 bp-systolic
8 bp-diastolic
id propertykey propertyvalue
1 value 200
1 unit lbs
1 ExtId 7
2 value 74
2 unit in
2 ExtId 8
3 value 120
3 unit mm[Hg]
3 ExtId 9
4 value 80
4 unit mm[Hg]
4 ExtId 9
7 value 126
7 unit mm[Hg]
7 ExtId 10
8 value 87
8 unit mm[Hg]
8 ExtId 10
id name desc ExtId related_id
1 weight 200 lbs 7
2 height 74 in 8
3 bp-systolic 120 mm[Hg] 9
4 bp-diastolic 80 mm[Hg] 9
7 bp-systolic 126 mm[Hg] 10
8 bp-diastolic 87 mm[Hg] 10
select
id,
name,
value + ' ' + unit [desc],
'' as related_id
from (
select s.ID, s.name, p.propertykey, p.propertyvalue from source S
inner join properties P on s.ID = P.ID
where s.name in ('height', 'weight', 'bp-systolic', 'bp-diastolic')
) as P
PIVOT (MAX([PropertyValue]) FOR [PropertyKey] IN ([Value], [Unit], [ExtId])) AS PT
id name desc related_id
1 weight 200 lbs
2 height 74 in
3 bp-systolic 120/80 4
7 bp-systolic 126/87 8
create table source (id int, name varchar(30))
create table properties (id int, propertykey varchar(30), propertyvalue varchar(30))
insert into source values (1, 'weight')
insert into source values (2, 'height')
insert into source values (3, 'bp-systolic')
insert into source values (4, 'bp-diastolic')
insert into source values (5, 'ABI')
insert into source values (6, 'notes')
insert into properties values (1, 'value', '200')
insert into properties values (1, 'unit', 'lbs')
insert into properties values (1, 'ExtId', '7')
insert into properties values (2, 'value', '74')
insert into properties values (2, 'unit', 'in')
insert into properties values (2, 'ExtId', '8')
insert into properties values (3, 'value', '120')
insert into properties values (3, 'unit', 'mm[Hg]')
insert into properties values (3, 'ExtId', '9')
insert into properties values (4, 'value', '80')
insert into properties values (4, 'unit', 'mm[Hg]')
insert into properties values (4, 'ExtId', '9')
insert into properties values (5, 'value', '123')
insert into properties values (6, 'value', 'this is a sample note')
create table #measures(id int, name varchar(50), value varchar(1000), extId varchar(3));
insert into #measures
(id, name)
select id, name from source;
update m
set extid = ext.propertyvalue
from #measures m
join properties ext on m.id = ext.id
and ext.propertykey = 'extid';
update m
set value = nm.propertyvalue
from #measures m
join properties nm on m.id = nm.id
and nm.propertykey = 'value';
update m
set value = value + ' ' + nm.propertyvalue
from #measures m
join properties nm on m.id = nm.id
and nm.propertykey = 'unit';
SELECT prim.ExtId,
prim.id,
CASE WHEN dias.id IS NOT NULL THEN 'blood pressure' ELSE prim.name END AS measure,
CASE WHEN dias.id IS NOT NULL THEN prim.[value] + '/' + dias.[value] ELSE prim.[value] END AS [desc],
dias.id AS related_id
FROM #measures prim
LEFT JOIN #measures dias
ON prim.ExtId = dias.ExtId
AND prim.name = 'bp-systolic'
AND dias.[name] = 'bp-diastolic'
WHERE prim.name <> 'bp-diastolic'
select s.id
, case when s.id = 3 then 'bloodpressure' else s.name end as name
, max(case when p1.propertykey = 'value' then p1.propertyvalue end) +
max(isnull('/' + p2.propertyvalue,'')) +
max(case when p1.propertykey = 'unit' then p1.propertyvalue end) as [desc]
, max(p2.id) as related_id
from source s
join properties p1
on s.id = p1.id
left join
properties p2
on p2.propertykey = 'value'
and p2.id = 4 -- 4:bp-diastolic
and p1.id = 3 -- 3:bp-systolic
where s.id in (1,2,3) -- 1:weight, 2:height, 3:bp-systolic
group by
s.id
, s.name