2012-11-16 78 views
6

我想獲得一個SQL Server數據透視表的工作,使我可以計數,然後總和列數(總共6)。數據透視表的目的是爲任意數量的生產站點彙總在線問卷調查結果。有6個問題可以有3個結果值 - 目標,行動和失敗。我想要做的是計算每個問題的目標,行動和失敗數量,然後對每個問題進行總結。所以,例如,生產現場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小提琴的例子嗎? –

回答

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 

SQL Fiddle with Demo

UNPIVOT需要你的列清單,並將其轉換爲多行,這使得它更容易算:

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 s。加入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