2010-11-29 3 views
0

問題:TSQL:単純なピボット、別個のセル。

私は2つの列のテーブルを持っています:ブックとトピック、そして1つのトピックはそれを参照する複数のブックとその逆の詩を持つことができます。

私は発生している別個の本の数を数え、それをピボットに適用しようとしています。次のコード構造は私が今までに持っているものです:

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

+0

何が問題だと思われますか? –

+0

私が得ているデータ出力は、私が上に投稿したものです。私はdistinctを追加しようとしましたが、ピボットステートメントの内部に置くとエラーが発生します。 Select句にdistinctを追加すると、両方の列が区別されるため、何も行われません。 –

答えて

0

本がカウントされますウィッヒで話題の順序は、それは実際には非常にシンプルなソリューションを重要ではありませんので、もし、あなたがちょうどあなたがあなたのDatasourceテーブルを定義するときtopic_id上MINまたはMAXを行う必要があり、[OK]を。したがって、次のようになります。

この本は表示される最小(または最大)トピックでのみカウントされることに注意してください。ここで特定の注文に続く話題に本を数えたい場合は、という表を作成し、好きな順にid int列を作成することをお勧めします(この場合、CSはid 1、PGM id 2など)、datasourceテーブルではその列のMINを計算します。

+0

ここからよく見えます。私は最小/最大機能がその操作を実行することを認識していませんでしたか?私はそれらをさらに読む必要があります。私はそこに追加しなければならない唯一のことは、そのselectステートメントの最後に 'group by book_id'節があると思います。 –

+0

ええ、私は "グループ"を忘れてしまった。私はもっ​​と注意する必要があります。私は今答えを編集しました。 – Lamak