2010-11-29 56 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过该列。