2012-11-16 8 views
6

Próbuję uzyskać tabelę przestawną programu SQL Server do pracy, która pozwala mi zliczyć, a następnie zsumować liczbę kolumn (łącznie 6). Celem tabeli przestawnej jest agregowanie wyników ankiet online dla dowolnej liczby zakładów produkcyjnych. Istnieje 6 pytań, które mogą zawierać 3 wartości wyników - cel, działanie i porażkę. Próbuję policzyć liczbę celów, akcji i porażek dla każdego pytania, a następnie podsumować dla każdego z nich. Na przykład, Zakład produkcyjny A może mieć 2 cele, 2 akcje i 2 porażki.Tabela przestawna serwera SQL zliczania i sumy

Rozumiem, że tabela przestawna SQL Server może dostarczyć te informacje, które następnie można wyświetlić w programie ASP.Net ReportViewer. Poniżej jest mój kod, ale nie działa, i może zrobić z jakiegoś eksperta pomoc:

 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 

Czy istnieje sposób okrągłe to, czy tabela przestawna nie jest rozwiązanie?

Tabela jest

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

Dane w tabeli chciałby to:

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 

Wynik szukam jest

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

można podać strukturę tabeli, niektóre dane przykładowe, a następnie pożądany skutek 'PIVOT'? – Taryn

+0

Zachowuję to do głównych danych - sprawdź oryginalne pytanie, aby uzyskać szczegółowe informacje. – Andy5

+0

Co nie działa? Czy możesz skonfigurować przykład SQL Fiddle? –

Odpowiedz

10

znacznie łatwiejszy sposób, aby wykonać to zapytanie byłoby zastosowanie zarówno funkcji UNPIVOT, a następnie 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 

Zobacz SQL Fiddle with Demo

UNPIVOT wykonuje swoją listę kolumn i przekształcenie go w wielu wierszach, które sprawia, że ​​znacznie łatwiej jest liczyć:

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 

UNPIVOT Wynik:

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

Następnie zastosowanie do tego PIVOT otrzyma liczbę tha t dla każdego z PRODUCTION_SITE s. Po dodaniu PIVOT wynik jest:

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

Dziękuję, ale ostatnie pytanie jest możliwe na przykład dodanie klauzuli where do pivota, jeśli użytkownik chce spojrzeć na 3 strony zamiast wszystkich witryn w danym okresie? – Andy5

+0

@ Andy5 Tak, nadal można zastosować klauzulę "WHERE", aby ograniczyć jakiekolwiek wyniki - podobne do tego - http://sqlfiddle.com/#!3/cd888/23 - można nawet zastosować wyrażenie "WHERE 'klauzula do wewnętrznego zapytania' UNPIVOT' – Taryn