SQL& Pivots - 聚合和语法

时间:2014-11-04 15:00:16

标签: sql sql-server-2008

我有几个与SQL(MS SQL Server 2008 R2)和Pivots相关的问题,特别是"如何"部分重点关注需要使用的聚合函数。

以下是我目前正在处理的两个表中的一组数据:

FirstTable

EntryID ReferenceID
694535 51
694536 51
694537 51
694538 51
694539 51

SecondTable

EntryID AttributeName ValueString ValueInteger ValueFloat ValueDate
694535 Name John NULL NULL NULL
694536 Name Anne NULL NULL NULL
694537 Name Jack NULL NULL NULL
694538 Name Lisa NULL NULL NULL
694535 UserNumber NULL 1 NULL NULL
694536 UserNumber NULL 2 NULL NULL
694537 UserNumber NULL 3 NULL NULL
694538 UserNumber NULL 4 NULL NULL

SecondTable可以包含更多的AttributeName实体,如JoinDate(ValueDate),Surname(ValueString)等。我想要做的是转动数据,使得数据透视表有一组唯一的EntryID,将AttributeName的值列为它的列,Value列中的值填充这些列。

我不确定要使用哪种聚合函数以及何时应该使用这些聚合函数。然后实际的Pivot语法似乎也得到了我,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用coalesce从值列中获取NON NULL值,然后执行PIVOT

如果你知道属性名称列表,你可以列出它们类似于NameUserNumber,你需要使用动态SQL来构建列名列表。

select T1.EntryID, [Name], [UserNumber] from 
(select EntryID, AttributeName, coalesce(valueString, valueInteger, ValueFloat, ValueDate) as Value from Table2) T2
pivot
( max(Value) for [AttributeName] in ( [Name], [UserNumber])
) pvt
join Table1 T1
on T1.EntryID = pvt.EntryID

输出就像

EntryID Name    UserNumber
694535  John    1
694536  Anne    2
694537  Jack    3
694538  Lisa    4