2012-11-16 18 views
6

SQL Serverピボットテーブルを使用して、数えて合計数(合計6個)の列を合計できるようにしようとしています。ピボットテーブルの目的は、任意の数の本番サイトのオンラインアンケート結果を集計することです。目標、行動、失敗の3つの結果値を持つことができる6つの質問があります。私がしようとしているのは、それぞれの質問に対して、目標、行動、失敗の数を数え、それぞれについてこれを合計することです。たとえば、生産サイトAには2つのターゲット、2つのアクション、2つの失敗があります。数と合計のあるSQL Serverピボットテーブル

私の理解は、SQL Serverピボットテーブルがこの情報を提供し、ASP.Net ReportViewerに表示できるということです。以下は私のコードですが、それは動作していない、といくつかの専門家の助けを借りて行うことができます:

 SELECT PRODUCTION_Site, 
    [Target], 
    [Action], 
    [Fail] 
    FROM 
    (SELECT Production_Site, 
      SUM(Coding), 
      SUM(Measurable), 
      SUM(Appearance), 
      SUM(Aroma), 
      SUM(Flavour), 
      SUM(Texture) 
       FROM t_Pqe_Grocery 
       GROUP BY Production_Site) AS T 
      PIVOT 
     (
      COUNT(Coding) FOR Grocery_Packaging_And_Coding IN ([Target],[Action],[Fail]) 
      COUNT(Measurable) FOR Grocery_Measurable IN ([Target],[Action],[Fail]) 
      COUNT(Appearance) FOR Grocery_Appearance IN ([Target],[Action],[Fail]) 
      COUNT(Aroma) FOR Grocery_Aroma IN ([Target],[Action],[Fail]) 
      COUNT(Flavour) FOR Grocery_Flavour IN ([Target],[Action],[Fail]) 
      COUNT(Texture) FOR Grocery_Texture IN ([Target],[Action],[Fail])) AS P 

このラウンド方法はありますか、またはピボットテーブルは解決策ではないでしょうか?

表は、表内の

Production_Site, 
Grocery_Packaging_And_Coding, 
Grocery_Measurable, 
Grocery_Appearance, 
Grocery_Aroma, 
Grocery_Flavour, 
Grocery_Texture 

データは、この希望される:

Site A, Target, Action, Fail, Target, Target, Target 
Site B, Target, Action, Fail, Target, Target, Target 
Site C, Target, Target, Target, Target, Target, Target 
Site A, Target, Target, Target, Target, Target, Target 

を私は探しています結果は

Production_Site | Target | Action | Fail 
Site A    10  1  1 
Site B    4  1  1 
Site C    6  0  0 
+0

あなたがテーブル構造、いくつかのサンプルデータと、その後 'PIVOT'の望ましい結果を提供することができますか? – Taryn

+0

私はこれをメインのデータに保存します - 詳細はオリジナルの質問を確認してください – Andy5

+0

何が問題なのですか? SQL Fiddleの例を設定できますか? –

答えて

10

このクエリを実行するには、はるかに簡単な方法ですUNPIVOTPIVOTの両方の機能を適用することです:

select * 
from 
(
    select Production_Site, value 
    from t_Pqe_Grocery 
    unpivot 
    (
    value 
    for col in (Grocery_Packaging_And_Coding, Grocery_Measurable, 
       Grocery_Appearance, Grocery_Aroma, 
       Grocery_Flavour, Grocery_Texture) 
) unp 
) src 
pivot 
(
    count(value) 
    for value in ([Target], [Action], [Fail]) 
) piv 

UNPIVOTはあなたの列リストを受け取り、それをはるかに簡単にカウントすることができた複数の行に変換しSQL Fiddle with Demo

を参照してください:

select Production_Site, value 
from t_Pqe_Grocery 
unpivot 
(
    value 
    for col in (Grocery_Packaging_And_Coding, Grocery_Measurable, 
       Grocery_Appearance, Grocery_Aroma, 
       Grocery_Flavour, Grocery_Texture) 
) unp 

アンピボット結果:

| PRODUCTION_SITE | VALUE | 
---------------------------- 
|   Site A | Target | 
|   Site A | Action | 
|   Site A | Fail | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site B | Target | 
|   Site B | Action | 
|   Site B | Fail | 
|   Site B | Target | 
|   Site B | Target | 
|   Site B | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 

その後、これにPIVOTを適用すると、カウントが取得されますPRODUCTION_SITEのそれぞれに対して必要なものを選択します。 PIVOTを追加した後の結果は次のとおりです。

| PRODUCTION_SITE | TARGET | ACTION | FAIL | 
-------------------------------------------- 
|   Site A |  10 |  1 | 1 | 
|   Site B |  4 |  1 | 1 | 
|   Site C |  6 |  0 | 0 | 
+0

ありがとうございます。しかし、最後の質問は、たとえば、ユーザーが3つのサイトを見たい場合にwhere節をピボットに追加することですある期間にわたってすべてのサイトではなく、 – Andy5

+0

@ Andy5はい、これと同様の結果を制限するために 'WHERE'節を適用することができます - http://sqlfiddle.com/#!3/cd888/23 - あなたは' WHERE'節'句を内側の' UNPIVOT'クエリ – Taryn

関連する問題