将行转移到SQL 2008列

时间:2014-01-20 15:54:50

标签: sql sql-server sql-server-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 (' +@cols +')
          ) 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 ...这就是为什么我在考虑一个案例陈述。

为了测试旋转源表的整个概念,我在移动到动态查询之前做了一些静态查询工作

这是一个简单的静态查询和数据库中的表的结果...这是我用来测试概念的...上面的代码使用的是我可能想要或可能不想使用的视图。 ..

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在源表中显示两行,我需要它在结果数据透视中显示为两列。

1 个答案:

答案 0 :(得分:0)

我知道这已经太迟了,但是如果你还没有弄清楚,here是一个SQLfiddle,可以做我认为你要求的事情。您的列名称从评论的一部分到另一部分仍然有所不同,所以我必须做出一些猜测,并且我确实添加了1列来指示每个propid的值类型。我相信你可以弄清楚如何将它用于你想要做的任何事情(如果你还没有想出来或已经放弃了!)无论如何,如果它太晚了也许它会被用来别人。

基本上,我将所有值都转换为文本,以便MAX()聚合可以对所有值进行操作,然后使用以与列字符串相同的方式构造的字符串将它们转换回正确的类型。在枢轴的第一部分添加额外的ROW_NUMBER()可保留相同DocID&的多个值。将PropID聚合为一个。我不确定是否应该为额外的Grantor行重复其他字段,所以我展示了两种方式。