我在这里做了很多评论,并且已经接近我需要的东西了,但我对最后一点感到难过(或者我希望如此)。
我正在使用动态数据透视转移我的数据
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在源表中显示两行,我需要它在结果数据透视中显示为两列。
答案 0 :(得分:0)
我知道这已经太迟了,但是如果你还没有弄清楚,here是一个SQLfiddle,可以做我认为你要求的事情。您的列名称从评论的一部分到另一部分仍然有所不同,所以我必须做出一些猜测,并且我确实添加了1列来指示每个propid的值类型。我相信你可以弄清楚如何将它用于你想要做的任何事情(如果你还没有想出来或已经放弃了!)无论如何,如果它太晚了也许它会被用来别人。
基本上,我将所有值都转换为文本,以便MAX()聚合可以对所有值进行操作,然后使用以与列字符串相同的方式构造的字符串将它们转换回正确的类型。在枢轴的第一部分添加额外的ROW_NUMBER()可保留相同DocID&的多个值。将PropID聚合为一个。我不确定是否应该为额外的Grantor行重复其他字段,所以我展示了两种方式。