2012-03-24 2 views
0

ich eine SQL haben, die die Bedingung (Bad, Arm, schlimmer) zählen kann in einem Tag und Gruppe es in einem Monat und wird wie folgt angezeigt:Wie die Anzeige Ansicht der Datensätze ändern und geändert in eine Reihe

YEARS MONTHS LV COUNTVAL 
----- ------ ----- -------- 
2009 Apr Bad   5 
2009 Apr Poor   3 
2009 Apr Worse  2 
2009 Aug Bad   3 
2009 Aug Poor   2 
2009 Aug Worse  5 
2009 Dec Bad   5 
2009 Dec Poor   2 
2009 Dec Worse  3 
2009 Feb Bad   5 
2009 Feb Poor   3 
2009 Feb Worse  2 
2009 Jan Bad   3 
2009 Jan Poor   3 
2009 Jan Worse  4 
2009 Jul Bad   2 
2009 Jul Poor   3 
2009 Jul Worse  5 
2009 Jun Bad   1 
2009 Jun Poor   4 
2009 Jun Worse  5 
2009 Mar Bad   4 
2009 Mar Poor   4 
2009 Mar Worse  2 
2009 May Bad   3 
2009 May Poor   5 
2009 May Worse  2 
2009 Nov Bad   1 
2009 Nov Poor   5 
2009 Nov Worse  4 
2009 Oct Bad   5 
2009 Oct Poor   3 
2009 Oct Worse  2 
2009 Sep Bad   2 
2009 Sep Poor   4 
2009 Sep Worse  4 
2010 Apr Bad   6 
2010 Apr Poor   1 
2010 Apr Worse  3 
2010 Aug Bad   3 
2010 Aug Poor   2 
2010 Aug Worse  5 
2010 Dec Bad   4 
2010 Dec Poor   2 
2010 Dec Worse  4 
2010 Feb Bad   4 
2010 Feb Poor   3 
2010 Feb Worse  3 
2010 Jan Bad   6 
2010 Jan Poor   3 
2010 Jan Worse  1 
2010 Jul Bad   2 
2010 Jul Poor   4 
2010 Jul Worse  4 
2010 Jun Bad   4 
2010 Jun Poor   3 
2010 Jun Worse  3 
2010 Mar Bad   6 
2010 Mar Poor   1 
2010 Mar Worse  3 
2010 May Bad   4 
2010 May Worse  6 
2010 Nov Bad   5 
2010 Nov Poor   2 
2010 Nov Worse  3 
2010 Oct Bad   3 
2010 Oct Poor   3 
2010 Oct Worse  4 
2010 Sep Bad   3 
2010 Sep Poor   4 
2010 Sep Worse  3 

Die SQL, die ich benutze:

select years, months, lv, countVal 
from 
(
select years, months, lv, count (lv) OVER (PARTITION BY years,months,lv) countVal from 

(
SELECT x.years, x.months, x.days, x.lv 
FROM airtest, 
XMLTABLE ('$d/cdata/name' passing xmldoc as "d" 
    COLUMNS 
    years integer path 'year', 
    months varchar(3) path 'month', 
    days varchar(2) path 'day', 
    lv varchar(5) path 'value' 
) as X 
    group by x.years, x.months, x.days, x.lv 
    order by x.years, x.months, x.days 
) 
) 
group by years, months, lv, countVal 
order by years,months 

Das Problem ist nun, wie es ändern in diesem Format werden ??

YEARS MONTHS Bad Poor  Worse 
----- ------ ----- -------- -------- 
2009 Apr  5  3  2 
2009 Aug  3  2  5 
2009 Dec  5  2  3 
......... 
......... 

Nach der Änderung wird es so etwas wie folgt.

Sie können sehen, dass die getrennten Daten in jedem Monat in einer Reihe gruppiert sind.

Danke für die Hilfe !!

Antwort

5

Bedingter Summe in jeder Spalte und Gruppe von Jahr/Monat:

SELECT years, months, 
     SUM(DECODE(lv, 'Bad', countval, 0)) Bad, 
     SUM(DECODE(lv, 'Poor', countval, 0)) Poor, 
     SUM(DECODE(lv, 'Worse', countval, 0)) Worse 
FROM (<your query>) 
GROUP BY years, months 

[hinzugefügt Gaurav Soni folgende]

ODER

WITH Base_Table AS 
(<your query>) 
SELECT years, months, 
     SUM(DECODE(lv, 'Bad', countval, 0)) Bad, 
     SUM(DECODE(lv, 'Poor', countval, 0)) Poor, 
     SUM(DECODE(lv, 'Worse', countval, 0)) Worse 
FROM base_Table 
GROUP BY years, months 
+0

Vielen Dank für Ihre Antwort, aber es funktioniert nicht gut. Werte, die nach der Berechnung falsch und viel größer werden. Sie können es mit diesem Bild überprüfen: user1264222

+0

OK, ich verstehe ... Die Methode ist das Löschen der SUM() vor DECODE() und es funktioniert perfekt. Vielen Dank!!! – user1264222

+0

Nun, das ist seltsam. Ohne SUM() und GROUP BY würden Sie 3 Zeilen für jedes Jahr/Monat (5,0,0; 0,3,0; 0,0,2) anstatt nur einer (5,3,2) haben. Wie auch immer, wenn dein Problem gelöst ist, dann ist alles gut :). – angus

Verwandte Themen