2012-06-16 22 views
5

İyi Günler.Tricky Query: Tahmin Tarihi

benim SQL sorgusunda bu sorundan bloke ediyorum: Aşağıdaki tablo göz önüne alındığında

:

 
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

Ben önümüzdeki aylarda olası satış masraf oluşturmaya gerek. Örneğin, bir mağazada bir ay için (SALES_period) "Haziran 2012" için bir giden satış (unit_sales) çizdim. Ağustos 2012'de B, Ekim 2012'de B tipi, Ekim 2012'de B tipi, A tipi bazı hizmet ücretlerini bekliyorum. Ayrıca farklı mağazalarda bazı farklı aylarda satışlarım var.

Böyle bir rapor şey üretmek çalışıyorum: (4 Ay Önce) Y unit_sales toplamıdır

 
    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 (2 Ay Önce) unit_sales toplamıdır mağaza (id) için için Rapor oluştur: Nereden : mağaza (id) Z mağaza (id) için (6 ay önce) unit_sales


sql keman söyledi verileri göz önüne alındığında ve bazı parametreler toplamıdır 2012- 06 için: 2 satış (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 | 
Usta Raporu

için ise bu 10 günü 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 | 

Satış (2012-04) içindir

 

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

Yardımlarınız için teşekkürler.

+2

Hum ... oldukça zor ve ben doğru soruyu anlamaya çalışan bir baş ağrısı biraz yaşıyorum: bellek, Jasper Reports, BIRT ...

Eh itibaren SQL tadını çıkarın. Ancak ilginç bir şekilde görünüyor, [sqlfiddle] oluşturabilir misiniz? (Http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F% Bazı verilerle 2Fsqlfiddle.com% 2F & ei = 5JvcT5bCIbCM0wWxg8jNCg & usg = AFQjCNFm12TxaUOyr1fCpsH3njbgA9q20A) ve beklenen bir sonuç ekleyin? –

cevap

2

SQLFiddle için çok teşekkürler! D

I (iyi SQL kullanırken) alabilirsiniz yakın şudur: verir

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; 

tam olarak ne istediğini (Size burada ulaşmak için çalışıyoruz bir gerçekten kötü raporu ve sahte çıktınızdaki bazı hatalara şu şekilde dikkat edin: p) boş satırları üretmemesi ve bu nedenle de tarikat uğruna durduğum yer.

Bunun mümkün olmadığını söylemiyorum ama için gerçekten çirkin oluyor.

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

SO üzerinde sormak için güzel bir soru olabilir: gerçekten içine almak istiyorsanız, ilk (ve en zor) iş tek bir sütun çıkışını oluşturan bir SQL sorgusu yazmaktır p

Bu diğer hile de bakabilirsiniz olabilir merakı uğruna

: gerçekten boş satırlarla çıkışını almak istiyorsanız,

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

Neyse, en basit yolu başka tablo dönemleri ile dolu olması etmektir . Sonraki LEFT JOIN işi bitiriyor.

Ana Rapor için, tam olarak aynı kalıptır (ve gerekiyorsa size yardımcı olmaktan memnuniyet duyarız) ama SQL'de bunu yapmaktan kesinlikle vazgeçiriyorum. Transpozisyon gerçekten çirkin olacak ve tamamen parametrelenmeyecek (imla?).

Raporu almak için ne kullandığınızı bilmiyorum, ancak bu işletme için uygun BI Araçları'na bakmalısınız. p

+0

Cevabınız için çok teşekkürler, Pazartesi gününe kadar geri besleme yapacağım). Yine, içten teşekkürlerimi. –

+0

Bu çok kullanışlıdır =) –