[英]PIVOT in SQL Server with no aggregate function
我有一个像这样的表(叫它T1
):
Date | Category | Data
-------------------------------
2014-01-01 | 1 | 1.0
2014-01-01 | 2 | 2.0
2014-01-01 | 3 | 3.0
2014-01-02 | 1 | 4.0
2014-01-02 | 2 | 5.0
2014-01-02 | 3 | 6.0
请注意, Data
是浮点数,而不是顺序数,我只是这样写的,因此更容易看到它们在结果中的位置。 还有一个表格将Category
编号转换为名称(让我们说( T2
):
Category | Name
----------------
1 | A
2 | B
3 | C
我想返回一个查询:
Date | B | C
---------------------------
2014-01-01 | 2.0 | 3.0
2014-01-02 | 5.0 | 6.0
我考虑过尝试使用以前从未使用过的PIVOT
,但是,如果不使用聚合函数,我将找不到找到它的方法。 但是,尽管如此,但由于每个Date
/ Category
组合实际上只有一行,因此使用像AVG
这样的聚合应该可以工作。 这是我基于这些文档的尝试:
SELECT [Date],
[2] as B,
[3] as C
FROM (SELECT * FROM T1 WHERE Category >= 2) AS SourceTable
PIVOT
(
AVG(Data)
FOR Category IN ([2], [3])
) AS PivotTable;
哪一种接近:
Date | B | C
---------------------------
2014-01-01 | 2.0 | NULL
2014-01-01 | NULL | 3.0
2014-01-02 | 5.0 | NULL
2014-01-02 | NULL | 6.0
但是,如何摆脱空值并使所有相同的日期位于同一行?
如果每个结果只有一个值,则可以使用任何聚合函数-例如: MAX
select * from
(select t.date, t.data,c.name from t1 t inner join category c on t.category = c.category) s
pivot (max(data) for name in ([b],[c])) p
第一部分是源数据
select t.date, t.data,c.name from t1 t inner join category c on t.category = c.category
然后, pivot
表对其进行重新排列,为name
列中的in
值创建列,并使用该列in
值的合计( max(data)
),这应该会提供所需的结果。
如果获取空值,可能是由于在源查询中使用select *
,而不是选择必填字段-即:replace
SELECT * FROM T1 WHERE Category >= 2
同
select category, data FROM T1 WHERE Category >= 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.