繁体   English   中英

没有聚合功能的SQL Server中的PIVOT

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM