2012-06-16 7 views
5

Guten Tag.Tricky Query: Prognosedaten

ich dieses Problem in meiner SQL-Abfrage blockiert bin:

die folgende Tabelle angegeben:

 
CREATE TABLE `Forecasted_Sales_tcl` (
`DEALER_id` varchar(15) NOT NULL, 
`SALES_period` date NOT NULL, 
`TYPE` int(2) NOT NULL, 
`UNIT_SALES` int(6) DEFAULT NULL, 
`HEAD_OFFICE_CODE` varchar(15) DEFAULT NULL 
PRIMARY KEY (`DEALER_CODE`,`SALES_MONTH`,`TYPE`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

http://sqlfiddle.com/#!2/b780c

Ich brauche die möglichen Verkaufsgebühren in den kommenden Monaten zu erzeugen. Zum Beispiel habe ich einen Outbound Sales (unit_sales) für einen Monat (SALES_period) "Juni 2012" auf einem Geschäft gezeichnet. Ich erwarte einige Service-Gebühren Typ A am August 2012, Typ B am Okt 2012, Typ C am Dez. 2012. Ich habe auch einige Out-gebundenen Umsatz auf einige verschiedene Monate in verschiedenen Geschäften.

Ich versuche, einen Bericht, so etwas zu erzeugen:

 
    Period |charge A | charge B |charge C | store_id 
2012-Jan | X  |  Y | Z | (id) 
2012-Feb | :  |  : | : : 
2012-Mar | :  |  : | : : 
2012-Apr | :  |  : | : : 
2012-May | :  |  : | : : 
2012-Jun | :  |  : | : : 
2012-Jul | :  |  : | : : 
2012-Aug | :  |  : | : : 
2012-Sep | :  |  : | : : 
2012-Oct | :  |  : | : : 
2012-Nov | :  |  : | : : 
2012-Dec | :  |  : | : : 

X Insgesamt ist die unit_sales (2 Monate) für den Speicher (id) Y insgesamt ist die unit_sales (4 Monate) für der Speicher (id) Z ist die unit_sales total (6 Monate) für den Speicher (id)


die genannten Daten über die sQL-Geige und einige Parameter Gegeben: Bericht generieren: Von: 2012- 06 An: 2013-07

 
    Period | Dealer Id | CHARGE X | CHARGE B | CHARGE C | 
2012-06 | 0001 |   0 |   0 |   0 | 
2012-07 | 0001 |   0 |   0 |   0 | 
2012-08 | 0001 |  100 |   0 |   0 | 
2012-09 | 0001 |   0 |   0 |   0 | 
2012-10 | 0001 |   0 |  100 |   0 | 
2012-11 | 0001 |   0 |   0 |   0 | 
2012-12 | 0001 |   0 |   0 |  100 | 
2013-01 | 0001 |   0 |   0 |   0 | 
2013-02 | 0001 |   0 |   0 |   0 | 
2013-03 | 0001 |   0 |   0 |   0 | 
2013-04 | 0001 |   0 |   0 |   0 | 
2013-05 | 0001 |   0 |   0 |   0 | 
2013-06 | 0001 |   0 |   0 |   0 | 
2013-07 | 0001 |   0 |   0 |   0 | 

    Period | Dealer Id | CHARGE A | CHARGE B | CHARGE C | 
2012-06 | 0002 |   0 |  10 |   2 | 
2012-07 | 0002 |   0 |   0 |   0 | 
2012-08 | 0002 |  10 |   0 |   0 | 
2012-09 | 0002 |  18 |   0 |   0 | 
2012-10 | 0002 |   5 |  10 |   0 | 
2012-11 | 0002 |   0 |  18 |   0 | 
2012-12 | 0002 |   0 |   5 |  10 | 
2013-01 | 0002 |   0 |   0 |  18 | 
2013-02 | 0002 |   0 |   0 |   5 | 
2013-03 | 0002 |   0 |   0 |   0 | 
2013-04 | 0002 |   0 |   0 |   0 | 
2013-05 | 0002 |   0 |   0 |   0 | 
2013-06 | 0002 |   0 |   0 |   0 | 
2013-07 | 0002 |   0 |   0 |   0 | 

Auf diesen 10 ist für den Vertrieb (2012-04), während 2 für den Verkauf ist (2012-02)

 
    Period | Dealer Id | CHARGE A | CHARGE B | CHARGE C | 
2012-06 | 0003 |   0 |   0 |   0 | 
2012-07 | 0003 |   0 |   0 |   0 | 
2012-08 | 0003 |   1 |   0 |   0 | 
2012-09 | 0003 |   0 |   0 |   0 | 
2012-10 | 0003 |   0 |   1 |   0 | 
2012-11 | 0003 |   0 |   0 |   0 | 
2012-12 | 0003 |   0 |   0 |   1 | 
2013-01 | 0003 |   0 |   0 |   0 | 
2013-02 | 0003 |   0 |   0 |   0 | 
2013-03 | 0003 |   0 |   0 |   0 | 
2013-04 | 0003 |   0 |   0 |   0 | 
2013-05 | 0003 |   0 |   0 |   0 | 
2013-06 | 0003 |   0 |   0 |   0 | 
2013-07 | 0003 |   0 |   0 |   0 | 
Meister Bericht

 

      |    2012-06    |    2012-07    |    2012-08    |    2012-09    |    2012-10    |    2012-11    | 
Dealer ID | CHARGE A | CHARGE B | CHARGE C | CHARGE A | CHARGE B | CHARGE C | CHARGE A | CHARGE B | CHARGE C | CHARGE A | CHARGE B | CHARGE C | CHARGE A | CHARGE B | CHARGE C | CHARGE A | CHARGE B | CHARGE C | 
001  |   0 |   0 |   0 |   0 |   0 |   0 |  100 |   0 |   0 |  18 |   0 |   0 |   0 |  100 |   0 |   0 |  18 |   0 | 
002  |   0 |  10 |   2 |   0 |   0 |   0 |  10 |   0 |   0 |   0 |   0 |   0 |   0 |  10 |   0 |   0 |   0 |   0 | 
003  |   0 |   0 |   0 |   0 |   0 |   0 |   1 |   0 |   0 |   0 |   0 |   0 |   0 |   1 |   0 |   0 |   0 |   0 | 

Danke für die Hilfe.

+2

Hum ... das ist ziemlich schwierig und ich bin ein wenig Kopfschmerzen, die versuchen, die Frage richtig zu verstehen. Aber es sieht wie ein interessantes aus, könntest du ein [sqlfiddle] erstellen (http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F% 2Fsqlfiddle.com% 2F & ei = 5JvcT5bCIbCM0wWxg8jNCg & usg = AFQjCNFm12TxaOOyr1fCpsH3njbgA9q20A) mit einigen Daten und fügen Sie ein erwartetes Ergebnis hinzu? –

Antwort

2

Vielen Dank für das SQLFiddle! Es ist ein wirklich böse Bericht Sie versuchen, hier zu erreichen: D

Die nächstgelegene ich (bei der Verwendung von anständigen SQL) bekommen kann, ist dies:

SELECT 
    DEALER_ID, 
    DATE, 
    -- Next 3 rows feature the trick to transpose lines to columns. 
    SUM(IF(CHARGE = 'A', UNIT_SALES, 0)) as CHARGE_A, 
    SUM(IF(CHARGE = 'B', UNIT_SALES, 0)) as CHARGE_B, 
    SUM(IF(CHARGE = 'C', UNIT_SALES, 0)) as CHARGE_C 
FROM (

SELECT -- Create a row for each charge A. 
    DEALER_id, 
    'A' as CHARGE, 
    DATE_FORMAT(DATE_ADD(SALES_PERIOD, INTERVAL 2 MONTH), "%Y-%m") as DATE, 
    UNIT_SALES 
FROM forecasted_sales_tcl 

UNION 

SELECT -- Create a row for each charge B. 
    DEALER_id, 
    'B' as CHARGE, 
    DATE_FORMAT(DATE_ADD(SALES_PERIOD, INTERVAL 4 MONTH), "%Y-%m") as DATE, 
    UNIT_SALES 
FROM forecasted_sales_tcl 

UNION 

SELECT -- Create a row for each charge C. 
    DEALER_id, 
    'C' as CHARGE, 
    DATE_FORMAT(DATE_ADD(SALES_PERIOD, INTERVAL 6 MONTH), "%Y-%m") as DATE, 
    UNIT_SALES 
FROM forecasted_sales_tcl 

) T 
WHERE DATE >= "2012-06" AND DATE <= "2013-07" 
GROUP BY DEALER_ID, DATE 
ORDER BY DEALER_ID, DATE; 

, dass Sie genau das gibt, was Sie wollen (und weisen Sie auf einige Fehler in Ihrer gefälschten Ausgabe übrigens hin: p) außer, dass es die leeren Reihen nicht erzeugt, und das ist, wo ich für die Anständigkeit stoppe.

Ich sage nicht, dass es nicht möglich ist, aber es wird wirklich hässlich zu erzeugen es.Wenn Sie wirklich in sie erhalten möchten, die erste (und schwierigste) Job ist eine SQL-Abfrage zu schreiben, die eine einzelne Spalte Ausgabe erzeugt:

DATE 
2012-06 
2012-07 
2012-08 
(...) 
2013-06 
2013-07 

Das ist eine schöne Frage SO fragen auf sein könnte: p

Für Neugier willen Sie einen Blick auf diese anderen Trick haben könnte:

SELECT @row := @row + 1 as row, t.* FROM some_table t, (SELECT @row := 0) r 

auf jeden Fall eine weitere Tabelle gefüllt haben mit den Perioden der ouput mit den leeren Reihen erhalten möchten, ist der einfachste Weg ist, wenn Sie wirklich . Weiter beendet den Job.

Für den Master Report ist es genau das gleiche Muster (und ich werde Ihnen gerne bei Bedarf helfen) aber Ich rate Ihnen dringend davon ab, dies in SQL zu tun, da es nicht wirklich seine Aufgabe ist. Die Transposition wird wirklich hässlich und absolut nicht parametrierbar sein (Rechtschreibung?).

Ich weiß nicht, was Sie verwenden, um den Bericht auszugeben, aber Sie sollten sich die richtigen BI-Tools für dieses Geschäft ansehen. Aus dem Gedächtnis, Jasper Reports, BIRT ...

Nun, genießen SQL: p

+0

Vielen Dank für die Antwort, ich werde bis Montag feed zurückgeben =). Nochmals, mein aufrichtiger Dank. –

+0

Das ist sehr nützlich =) –