2010-11-29 26 views
0

該問題:TSQL:簡單樞軸,不同的單元格。不能得到它的工作

我有一個兩列的表:書籍和主題,和一個單一的主題可以有多個書引用它,反之亦然。

我正在嘗試計算出現的不同數量的書籍,並將它們應用於數據透視表。下面的代碼結構是我到目前爲止有:

With dataSource 
as (
select book_id, topic_id 
FROM BKINFO.BookTopics 
    ) 
select 
[CS] as 'CmpSci' 
,[PGM] + [NET] + [VB] as 'CmpPgm' 
,[DB] as 'DB' 
,[SQL]+[MYSQL]+[ORA]+[SSRV] as 'SQL' 
, [XML]as 'XML' 
, [SCI] as 'Science' 
, [POE] + [FCT] as 'Lit' 
from dataSource 
pivot(
count(book_id) 
for topic_id 
in([CS],[PGM],[NET],[VB],[DB],[SQL],[MYSQL],[ORA],[SSRV], [XML], 
[SCI], [POE], [FCT]) 
)tblPivot 

樞軸報表和其他選擇在那裏遇到的問題的要求。 (這是一個在線課程)數據輸出應如下所示:

CmpSci  CmpPgm  DB   SQL   XML   Science  Lit 
----------- ----------- ----------- ----------- ----------- ----------- ----------- 
0   28   9   40   2   10   3 

我在這裏錯過了什麼?我花了大約4個小時試圖弄清楚這一點,它似乎太簡單了。

謝謝!

+0

你現在輸出的是什麼? 另外,如果你需要計算不同的書籍,那麼你應該說這樣指定它:count(distinct book_id)。 – Serguei 2010-11-29 04:13:42

+0

什麼似乎是問題? – 2010-11-29 04:14:54

回答

0

好了,如果至極的話題的書會算不要緊的順序,它實際上是非常簡單的解決方案,你只需要做一個MINMAX在topic_id當你定義Datasource表。所以,它會是這樣的:

With dataSource 
as (
select book_id, MIN(topic_id) AS topic_id -- it can be MAX(topic_id) as well 
FROM BKINFO.BookTopics 
GROUP BY book_id 
    ) 
select 
[CS] as 'CmpSci' 
,[PGM] + [NET] + [VB] as 'CmpPgm' 
,[DB] as 'DB' 
,[SQL]+[MYSQL]+[ORA]+[SSRV] as 'SQL' 
, [XML]as 'XML' 
, [SCI] as 'Science' 
, [POE] + [FCT] as 'Lit' 
from dataSource 
pivot(
count(book_id) 
for topic_id 
in([CS],[PGM],[NET],[VB],[DB],[SQL],[MYSQL],[ORA],[SSRV], [XML], 
[SCI], [POE], [FCT]) 
)tblPivot 

你應該知道,這本書是隻在它出現的最小(或最大)主題進行計數。現在,如果您希望按照特定順序將該書計算在主題上,那麼我建議您創建一個表topic,並按您喜歡的順序創建一個id int列(在這種情況下,CS將爲id 1,PGM id 2,等等),並且在表datasource計算MIN過該列。