2012-11-16 16 views
6

Sto cercando di far funzionare una tabella pivot di SQL Server che consente di contare e quindi sommare un numero di colonne (6 in totale). Lo scopo della tabella pivot è aggregare i risultati del questionario online per qualsiasi numero di siti di produzione. Ci sono 6 domande che possono avere 3 valori di risultato: Target, Azione e Fail. Quello che sto cercando di fare è contare il numero di Target, Azione e Fail per ogni domanda, e poi sommare per ognuno. Quindi, ad esempio, il sito di produzione A potrebbe avere 2 bersagli, 2 azioni e 2 fallimenti.Tabella pivot di SQL Server con conteggi e somme

La mia comprensione è che la tabella pivot di SQL Server potrebbe fornire queste informazioni, che possono quindi essere visualizzate in ASP.Net ReportViewer. Qui di seguito è il mio codice, ma non funziona, e potrebbe fare con qualche aiuto esperto:

 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 

C'è un modo intorno a questo, o è Tabella pivot non è la soluzione?

Table è

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

dati nella tabella desidera un

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 

il risultato che sto cercando è

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

è possibile fornire la struttura della tabella, alcuni dati di esempio e quindi il risultato desiderato del 'PIVOT'? – Taryn

+0

Tengo questo ai dati principali - controlla la domanda originale per dettagli – Andy5

+0

Che cosa non funziona? Puoi impostare un esempio di SQL Fiddle? –

risposta

10

Un modo molto più semplice per eseguire questa query sarebbe quello di applicare sia il UNPIVOT e quindi le funzioni PIVOT:

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 

Vedi SQL Fiddle with Demo

Il UNPIVOT prende il vostro elenco di colonne e di trasformarlo in più righe, che rende molto più facile contare:

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 

Risultato UnPivot:

| 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 | 

Quindi applicando il PIVOT a questo otterrà il conteggio tha t vuoi per ciascuno dei PRODUCTION_SITE s. Dopo aver aggiunto il PIVOT il risultato è:

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

Grazie, ma un'ultima domanda è possibile ad esempio aggiungere una clausola where al pivot se un utente vuole guardare 3 siti piuttosto che tutti i siti in un periodo di tempo? – Andy5

+0

@ Andy5 sì, puoi ancora applicare una clausola 'WHERE' per limitare qualsiasi risultato - simile a questo - http://sqlfiddle.com/#!3/cd888/23 - puoi anche applicare un' WHERE 'clausola alla query interna' UNPIVOT' – Taryn