2014-01-20 98 views
1

我已经在这里做了相当多的回顾,并且已经接近我需要的东西,但是我很难理解最后一点(或者我希望如此)。数据透视行到列SQL 2008

我使用动态枢纽从

DocID PropID StrVal NumVal DateVal 
5938 21 TARRO, THOMAS A III NULL NULL 
5938 21 TARRO, JUDITH A NULL NULL 
5938 22 UNITED STATES NULL NULL 
5938 27 NULL NULL 2011-10-03 09:33:00.000 
5938 28 Discharge Release NULL NULL 
5938 29 NULL 1115 NULL 
5938 30 207 NULL NULL 

转我的数据向

DocId 21 22 27 28 29 30 
5938 TARRO, THOMAS A III UNITED STATES 2011-10-03 09:33:00.000 Discharge Release 1115 207 
    TARRO, JUDITH A 

这里所需要的结果是代码

Declare @cols as nvarchar(max), 
    @query as nvarchar(max) 

Select @cols = STUFF ((select distinct ',' + QUOTENAME(FieldName) 
        from GrantorGrantee 
        WHERE tocid='5938' 
        FOR XML Path(''), Type 
        ).value('.','NVARCHAR(MAX)'),1,1,'') 

Set @query = 'Select tocid, '+ @cols + 'from 
     (
      select fieldname, tocid, FieldStrValue, FieldNumValue, FieldDateValue 
      from GrantorGrantee 
     ) x 
     PIVOT 
     (
      max(FieldStrValue) 
      for fieldname in (' [email protected] +') 
     ) p ' 

execute (@query) 

这段代码填充StrVal从样本数据,但我需要填写每个PropID的相应数据列。无论是字符串,值还是日期。

从以下数据:

Tocid  fieldname   StrVal     NumVal  DateVal 
5938  Grantors   Tarro, Thomas A III NULL  NULL 
5938  Grantors   Tarro, Judith A  NULL  NULL 
5938  TransactionDate NULL     NULL  2011-10-03 09:33:00.00 
5938  InstrumentType Discharge Release  NULL  NULL 
5938  BookNumber  NULL     1115  NULL 
5938  PageRange   0207     NULL  NULL 

我可以在枢轴使用case语句中的聚合函数?这是处理最好的方法吗?我也必须处理propid = 21的double值...

谢谢!

这是上面的代码的结果。

Tocid BOOKNUMBER Grantees Grantors InstrumentType PageRange TransactionDate  
5938 NULL  UNITED STATES TARRO, THOMAS A III Discharge Release 0207 NULL 
5938 NULL  NULL    NULL NULL NULL NULL 
5938 NULL  NULL    NULL NULL NULL NULL 

所以我抢StrVal和填充列,但SQL不知道如何处理DateVal和NumVal ...这就是为什么我在想一个case语句做。

为了测试旋转我没有移动到动态查询

之前做一个静态查询一些工作的源表的这整个概念下面是一个简单的静态查询,并从数据库中的表导致...这是我用什么来测试的概念...上面的代码使用一种观点认为,我可能会或可能不会想用...

select tocid, 21,22,27,28,29,30 
from (
    select tocid, prop_id 
    from dbo.propval 
    where dbo.propval.prop_id in (21,22,27,28,29,30) and tocid='5938' 
    --order by tocid 
    ) x 
    PIVOT 
    (
    max(prop_id) 
     for prop_id in ([21],[22],[27],[28],[29],[30]) 
    ) as p 

结果在下面......不列标题

5938 21 22 27 28 29 30 

这让我参与到那里......

问题是,在源表中的两行中显示的PropId 21,我需要它显示在作为两列的结果枢轴。

+0

如果您可以添加生成的实际SQL以及它返回的内容,则会更容易提供帮助。欢呼 –

+1

为什么从一开始就如此困难?为什么不先写一个* static *查询?只需假设一些有限数量的属性并为这些属性编写解决方案。为了将结果转换为动态查询,您可能会采用与单列转轴相同的方法。 “我还必须处理双重价值......” - 这是你问题的一部分吗?请解释你想如何处理。 (从你的例子中不是很清楚,如果多个值进入同一行,用一些分隔符或不同的行分隔?)另外,你还没有真正显示你自己尝试过什么... –

+0

我已经更新了这篇文章一些额外的信息...谢谢! – user3215391

回答

0

我知道这是晚了,但如果你还没有弄清楚,here是SQLfiddle,它可以做我认为你所要求的。你的专栏名称在你的评论的一部分中仍然有所不同,所以我不得不做出一些猜测,并且我添加了1列来指示每个propid的值的类型。我相信你大概可以弄清楚如何将它应用到你想要做的任何事情上(如果你还没有弄明白或者已经放弃了!)无论如何,如果它太晚了,它可能会用到其他人。

基本上,我将所有值都作为文本进行转换,以便MAX()聚合可以对所有这些值进行操作,然后在使用以与列字符串相同的方式构造的字符串进行透视后将它们转换回正确的类型。将额外的ROW_NUMBER()添加到数据透视的第一部分,可以将同一DocIDPropID的多个值聚合为一个。我不确定其他领域是否应该为额外的授予者行重复,所以我展示了两种方式。