2014-04-29 59 views
1

我有這樣一個表(可以稱之爲T1):PIVOT在SQL Server中沒有聚合函數

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 

但我怎麼擺脫空的,並得到所有相同的日期是在同一行?

+0

可正常工作更換

SELECT * FROM T1 WHERE Category >= 2 

(結果中有兩行),你的問題在哪裏? – dean

+1

您的表格中有更多列未顯示在此處。也許是使每行都是唯一的ID標識列。當你在你的子查詢中選擇*時,你也在檢索ID列,這會使你的結果變成你所看到的。將*更改爲實際需要的列(日期,數據和類別)。 –

+1

爲了強調Mikael的觀點 - 考慮您在應用'PIVOT'運營商之前立即擁有的結果集。 *'PIVOT'運算符中沒有提到的每個*列都有效地變成了'GROUP BY'列,因此每個獨特的組合(在'PIVOT'列中未提及)將在結果集中生成一行。 –

回答

1

如果只有一個值對於每個結果,則可以使用任何的聚合函數 - 例如: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值創建列,並使用聚合(max(data))作爲該列中的值,該值應給出所需的結果。

如果您收到空值,它可能在你的源查詢使用select *,而不是選擇所需要的領域 - 即:與

select category, data FROM T1 WHERE Category >= 2 
+0

謝謝,請參閱我更新的嘗試,因爲我發現了第一個錯誤。 – Dan

+0

完美,'SELECT *'是個問題。謝謝! – Dan