2014-01-29 21 views
2

假设我正在连接表,意图生成将某些行转换为列的最终表。 FK是一个外键约束,信息1和信息2被用来返回要么日期或空SQL Server:连接,重复记录和联合

FK1 | Info1 | Date1 
FK1 | Info2 | Date2 
FK2 | Info1 | Date1 
FK2 | Info2 | Date2 

我要回应该是这样的表格:

FK1 | Date1 | Date2 
FK2 | Date1 | Date2 

相反,什么返回是:

FK1 | Date1 | Date2 
FK1 | Date1 | Date2 
FK2 | Date1 | Date2 
FK2 | Date1 | Date2 

在阅读了一些其他帖子后,似乎我需要联合这个工作,但我不知道该把它放在哪里。我实际的查询低于:

select c.idContract, 
     c.sgCommonName, 
     cl.sgClientTitle, 
     cl.sgHomeAddress, 
     cl.sgLetterCasual, 
     c.sgLotAddress, 
     ffd.sgCaption, 
     ffv.sgTextValue, 
     case when fkidffdefinition = 1161 then dtDateValue end as '11 Day', 
     case when fkidffdefinition = 1162 then dtDateValue end as '30 Day' 
from 
      tblContracts c 
inner join tblClients cl on cl.idClient = c.fkidClient 
inner join tblFlexFieldValues ffv on ffv.fkidcontract = c.idContract 
inner join tblFlexfieldDefinition ffd on ffd.idFlexFieldDefiniition = ffv.fkidFFDefinition 

where ffd.idFlexFieldDefiniition in (1161,1162) 

的问题是,加入正在加入这些值(1161,1162),但我不明白如何“串联”的连接(如果是有道理的)

干杯。

+0

您能否提供一些实际的数据和符合您实际查询的结果? –

+0

使用[SQLFiddle](http://sqlfiddle.com/)发布示例。 – EfrainReyes

回答

3

不知怎的,我觉得这是你想要的查询:

select c.idContract, c.sgCommonName, cl.sgClientTitle, cl.sgHomeAddress, cl.sgLetterCasual, 
     c.sgLotAddress, ffd.sgCaption, ffv.sgTextValue, 
     max(case when fkidffdefinition = 1161 then dtDateValue end) as "11 Day", 
     max(case when fkidffdefinition = 1162 then dtDateValue end) as "30 Day" 
from tblContracts c inner join 
    tblClients cl 
    on cl.idClient = c.fkidClient inner join 
    tblFlexFieldValues ffv 
    on ffv.fkidcontract = c.idContract inner join 
    tblFlexfieldDefinition ffd 
    on ffd.idFlexFieldDefiniition = ffv.fkidFFDefinition 
where ffd.idFlexFieldDefiniition in (1161, 1162) 
group by c.idContract, c.sgCommonName, cl.sgClientTitle, cl.sgHomeAddress, cl.sgLetterCasual, 
     c.sgLotAddress, ffd.sgCaption, ffv.sgTextValue; 

这是一个集合的查询,这将把这两个日期在同一行。顺便说一句,对列名使用单引号是个不错的主意。改用双引号或方括号。

+0

完美,谢谢。 我不得不删除sgCaption字段,因为它包含与其他所有内容不同的值,并且正在执行重复。 –