2012-06-16 16 views
5

Buona giornata.Quick ingannevole: date di previsione

sto bloccata da questo problema nella mia query SQL:

Data la seguente tabella:

 
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

ho bisogno di generare le eventuali commissioni di vendita nei prossimi mesi. Ad esempio, ho tracciato vendite in uscita (unit_sales) per un mese (SALES_period) "giugno 2012" in un negozio. Mi aspetto dei costi di servizio tipo A per l'agosto 2012, tipo B per ottobre 2012, tipo C per dicembre 2012. I anche hanno alcune vendite fuori limite su diversi mesi in negozi diversi.

Sto cercando di generare un rapporto simile a questa:

 
    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 è totale le unit_sales (2 mesi fa) per il negozio (id) Y è totale i unit_sales (4 mesi fa) per il negozio (id) Z è totale le unit_sales (6 mesi fa) per l'archivio (id)


Attribuite tali dati sul violino SQL e alcuni parametri: Genera report: Da: 2012- 06 A: 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 | 

In questa 10 è per le vendite (2012-04), mentre 2 è per le vendite (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 | 
Maestro Relazione

 

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

Grazie per l'aiuto.

+2

Hum ... è abbastanza difficile e sto avendo un po 'di mal di testa cercando di capire correttamente alla domanda. Ma sembra interessante, potresti creare un [sqlfiddle] (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 = AFQjCNFm12TxaUOyr1fCpsH3njbgA9q20A) con alcuni dati e aggiungere un risultato previsto? –

risposta

2

Mille grazie per SQLFiddle! E 'un rapporto davvero brutto si sta cercando di realizzare qui: D

Il più vicino che posso arrivare a (durante l'utilizzo di SQL decente) è questo:

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; 

Che ti dà esattamente quello che vuoi (e segnalare alcuni errori nel tuo falso output: p) tranne che non genera le righe vuote ed è lì che mi fermo per amor di decenza.

Non dico che non è possibile ma diventa davvero brutto a generarlo.Se davvero si vuole entrare in esso, il primo (e più difficile) compito è quello di scrivere una query SQL che genera una singola uscita di colonna:

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

Che potrebbe essere una bella domanda da fare su SO: p

per l'amor curiosità si potrebbe avere uno sguardo a questo altro trucco:

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

in ogni caso, se si vuole veramente ottenere l'output con le righe vuote, il modo più semplice è quello di avere un altro tavolo pieno di periodi . Il prossimo LEFT JOIN termina il lavoro.

Per il Rapporto Maestro è esattamente lo stesso modello (e sarò felice di aiutarvi con esso, se necessario), ma Io vi scoraggiano dal fare questo in SQL come non è davvero il suo lavoro. La trasposizione sarà davvero brutta, e assolutamente non parametrizzabile (ortografia?).

Non so che cosa state usando per uscire dal rapporto, ma dovreste esaminare gli strumenti di BI appropriati per questa attività. Dalla memoria, Jasper Reports, BIRT ...

Beh, godere di SQL: p

+0

Grazie mille per la risposta, restituirò il feed entro lunedì =). Di nuovo, i miei sinceri ringraziamenti. –

+0

Questo è molto utile =) –