2016-11-30 1 views
1

私はこの出力を得るためにSELECT声明を行った。ここでPIVOTをテーブル/クロスタブのクエリにする方法は?

MOVIE       Critic Type Average Rating 
------------------------  ------------ -------------- 
30 Minutes or Less    Critic     2.00 
30 Minutes or Less    User     4.20 
A Lonely Place to Die   Critic    10.00 
A Lonely Place to Die   User     8.50 
Taken       Critic     6.17 
Taken       User     7.27 
Taken 2       Critic     4.00 
Taken 2       User     6.29 

8 rows selected 

SELECT文は次のとおりです。

SELECT MovieTitle AS "MOVIE", TBLCRITICCLASS.CRITICCLASSDESC AS "Critic Type", AVG(TBLREVIEW.REVIEWSTAR) AS "Average Rating" 
FROM TBLMOVIE 
INNER JOIN TBLREVIEW ON TBLMOVIE.MOVIEID = TBLREVIEW.MOVIEID 
INNER JOIN TBLCRITIC ON TBLREVIEW.CRITICID = TBLCRITIC.CRITICID 
INNER JOIN TBLCRITICCLASS ON TBLCRITIC.CRITICCLASSID = TBLCRITICCLASS.CRITICCLASSID 
GROUP BY MovieTitle, TBLCRITICCLASS.CRITICCLASSDESC 
ORDER BY Movietitle; 

私は出力を得るためにPIVOTと、この出力には、このテーブルをオンにします批評家の評価とユーザーの評価はそれ自身のカテゴリである:

MOVIE       Critic Rating User Rating 
------------------------  ------------- ----------- 
30 Minutes or Less    2.00     4.20 
A Lonely Place to Die   10.00     8.50 
Taken       6.17     7.27 
Taken 2       4.00     6.29 

私の試み次のとおりです。

SELECT * FROM 
(
    SELECT MovieTitle AS "MOVIE", AVG(TBLREVIEW.REVIEWSTAR) AS "Critic Rating", AVG(TBLREVIEW.REVIEWSTAR) AS "User Rating" 
    FROM TBLMOVIE 
    INNER JOIN TBLREVIEW ON TBLMOVIE.MOVIEID = TBLREVIEW.MOVIEID 
    INNER JOIN TBLCRITIC ON TBLREVIEW.CRITICID = TBLCRITIC.CRITICID 
    INNER JOIN TBLCRITICCLASS ON TBLCRITIC.CRITICCLASSID = TBLCRITICCLASS.CRITICCLASSID 
    GROUP BY MovieTitle, TBLCRITICCLASS.CRITICCLASSDESC 
    ORDER BY Movietitle 
) 

PIVOT 
(
    AVG(TBLREVIEW.REVIEWSTAR) AS "Critic Rating" 
    FOR TBLREVIEW.REVIEWSTAR IN (TBLCRITICCLASS.CRITICCLASSDESC) 

    AVG(TBLREVIEW.REVIEWSTAR) AS "User Rating" 
    FOR TBLREVIEW.REVIEWSTAR IN (TBLCRITICCLASS.CRITICCLASSDESC) 
) 

私はエラーを取得し、それはおそらくサブクエリとスキルの私の不足のためだ、私は私が私の優先出力を取得し、どのようにそれを修正するわけではない理由を理解したいと思います。

編集:ここでは

は、関連するテーブルです:

File1 (Pastebin)

File2 (Pastebin)

+0

いくつかのこと... 'PIVOT'がすでに集約関数である(GROUP BY''のようにして、 '' AVG(...)を選択)、あなたはグループに必要となりませんので、ピボットする前に平均します。 'AVG()'は、ピボットするときに実行できます。次に、サブクエリでも 'ORDER BY'を使わないでください。必要であれば、唯一の「ORDER BY」が外部クエリになければならない。最後に、 'PIVOT'構文が正しいのではありません - @xQbertは彼の答えでそれを行う方法を示しています。質問にテーブル名と列を表示する場合は、現在のクエリとPIVOTをすべて1つのステートメントに書き込むことができます。 (私はあなたの現在の試みから推測することができますが、私はしません) – mathguy

+0

私はpastebinのリンクにテーブルを追加しました。 –

答えて

2

あなたは自分のピボット文が間違っています。あなたは以下のCTEのためにあなたのクエリを代用することができ、それは動作するはずです。あなたは二つの値(「評論家」とユーザー ')aggregrate avgなりを持っているため、「評論家タイプ」にpivitingさ

を「なぜ私は私の好みの出力を得ていないのです」、と同様に

SELECT * 
FROM (SELECT MovieTitle AS "MOVIE" 
      , TBLCRITICCLASS.CRITICCLASSDESC AS  "Critic Type" 
      , AVG(TBLREVIEW.REVIEWSTAR) AS "Average Rating" 
     FROM TBLMOVIE 
     INNER JOIN TBLREVIEW 
     ON TBLMOVIE.MOVIEID = TBLREVIEW.MOVIEID 
     INNER JOIN TBLCRITIC 
     ON TBLREVIEW.CRITICID = TBLCRITIC.CRITICID 
     INNER JOIN TBLCRITICCLASS 
     ON TBLCRITIC.CRITICCLASSID = TBLCRITICCLASS.CRITICCLASSID 
     GROUP BY MovieTitle, TBLCRITICCLASS.CRITICCLASSDESC 
    ) 
PIVOT (AVG("Average Rating") for "Critic Type" 
    in ('Critic' as "Critic Rating", 'User' as "User Rating"))) 
ORDER BY Movie 

センス。あなたの例では、レコードごとに1つの値しかないので、最小値/最大値も同様に機能します。

ピボットでは、ピボットの "in"部分の各列を指定し、 "Critic Type"列の値に基づいてデータを整理する方法をDBエンジンに決定させます。

各値を指定する必要があるため、動的SQLを使用せずにダイナミックレンジを設定することはできません。

注:「ピボット」フィールドの値と異なる名前が必要な場合は、ピボットの「IN」部分の列に別名を付けることができます。

enter image description here

+0

例として使用したのと同様の方法で(サブクエリを使用して)行う方法はありますか?CTEに精通していません。 –

+0

私はあなたの質問をピボットに取り入れました。 2つのクエリのオーバーヘッドなしでこれを行うより効率的な方法があるでしょう。私はちょうど現時点でその詳細レベルに対処する時間がありません。 – xQbert

関連する問題