2012-06-16 35 views
5

Ngày tốt lành.Truy vấn khó khăn: Ngày dự báo

Tôi đang bị chặn bởi sự cố này trong truy vấn SQL của tôi:

Với bảng sau:

 
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

tôi cần phải tạo ra những chi phí bán hàng tốt trong những tháng tới. Ví dụ: tôi đã vẽ một doanh số bán ra (đơn vị_sales) cho một tháng (SALES_period) "tháng 6 năm 2012" trên một cửa hàng. Tôi mong đợi một số phí dịch vụ loại A vào tháng 8 năm 2012, loại B vào tháng 10 năm 2012, loại C vào tháng 12 năm 2012. Tôi cũng có có một số doanh số bán hàng bị ràng buộc vào một số tháng khác nhau trên các cửa hàng khác nhau.

Tôi cố gắng để tạo ra một cái gì đó báo cáo như thế này:

 
    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 là tổng số unit_sales (2 tháng trước) cho các cửa hàng (id) Y là tổng số unit_sales (4 tháng trước) cho các cửa hàng (id) Z là tổng số unit_sales (6 tháng trước) cho các cửa hàng (id)


với dữ liệu nói trên fiddle sql và một số thông số: Generate Report: Từ: 2012- 06 Để: 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 | 

Ngày 10 này dành cho Sales (2012-04) trong khi 2 là dành cho việc bán hàng (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 | 
Báo cáo tổng

 

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

Cảm ơn sự giúp đỡ.

+2

Hum ... khá phức tạp và tôi đang có một chút đau đầu cố gắng hiểu chính xác câu hỏi. Nhưng có vẻ thú vị, bạn có thể tạo [sqlfiddle] (http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F% không 2Fsqlfiddle.com% 2F & ei = 5JvcT5bCIbCM0wWxg8jNCg & usg = AFQjCNFm12TxaUOyr1fCpsH3njbgA9q20A) với một số dữ liệu và thêm kết quả mong muốn? –

Trả lời

2

Cảm ơn rất nhiều về SQLFiddle! Đó là một báo cáo thực sự khó chịu bạn đang cố gắng để đạt được ở đây: D

Gần nhất tôi có thể nhận được (trong khi sử dụng SQL đàng hoàng) là thế này:

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; 

Điều đó cho bạn biết chính xác những gì bạn muốn (và chỉ ra một số sai lầm trong đầu ra giả của bạn bằng cách: p) ngoại trừ việc nó không tạo ra các hàng trống và đó là nơi tôi dừng lại vì mục đích lịch sự.

Tôi không nói điều đó là không thể nhưng nó trở nên thực sự xấu xí để tạo ra nó.Nếu bạn thực sự muốn nhận được vào nó, công việc đầu tiên (và khó khăn nhất) là viết một truy vấn SQL mà tạo ra một sản lượng cột duy nhất:

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

Đó có thể là một câu hỏi tốt đẹp để hỏi về SO: p

Đối với sự tò mò vì bạn có thể có một cái nhìn tại thủ thuật này khác:

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

Dù sao, nếu bạn thực sự muốn có được ouput với các hàng trống rỗng, cách đơn giản nhất là đã bảng khác lấp đầy với các giai đoạn . Tiếp theo LEFT JOIN hoàn thành công việc.

Đối với Báo cáo chính nó giống hệt nhau (và tôi sẽ vui lòng giúp bạn nếu cần) nhưng Tôi mạnh mẽ không khuyến khích bạn làm điều này trong SQL vì nó không thực sự là công việc của nó. Chuyển vị sẽ thực sự xấu xí, và hoàn toàn không thể tham số (chính tả?).

Tôi không biết bạn đang sử dụng gì để báo cáo báo cáo nhưng bạn nên xem xét các Công cụ BI thích hợp cho doanh nghiệp này. Từ bộ nhớ, Jasper Reports, BIRT ...

Vâng, hãy tận hưởng SQL: p

+0

Cảm ơn rất nhiều vì đã trả lời, tôi sẽ trả lại nguồn cấp dữ liệu vào Thứ Hai =). Một lần nữa, cảm ơn chân thành của tôi. –

+0

Điều này rất hữu ích =) –

Các vấn đề liên quan