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