2010-08-11 40 views
1

其餘動態完成我有兩個表:MySQL查詢:從數據庫中選擇現有個月,並與今年的月

CREATE TABLE 'sales_sheet' (
    `_id` int(11) NOT NULL AUTO_INCREMENT, 
    `_typed_by` int(11) DEFAULT NULL, 
    `_product_id` int(11) DEFAULT NULL, 
    `_year` date DEFAULT NULL, 
    `_validation_state` int(11) DEFAULT NULL, 
    PRIMARY KEY (`_id`), 
    KEY `_product_id` (`_product_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

CREATE TABLE 'sales_sheet_entries' (
    `_id` int(11) NOT NULL AUTO_INCREMENT, 
    `_sheet_id` int(11) DEFAULT NULL, 
    `_month` date DEFAULT NULL, 
    `_quantity` int(11) DEFAULT NULL, 
    PRIMARY KEY (`_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

這兩個表是用來年銷售額店張。第一個表格存儲產品標識符,年份和工作表的驗證狀態。第二個存儲產品的月銷售額。

我想,在一個查詢中得到這樣的結果:在銷量列

--------------------------------------------- 
| Month   | Sales volume | 
--------------------------------------------- 
| January 2010  |  | 
| February 2010  | XXXXXX | 
| March 2010  | XXXXXX | 
| April 2010  | XXXXXX | 
| May 2010   |  | 
| June 2010   |  | 
| July 2010   |  | 
| August 2010  |  | 
| September 2010  |  | 
| October 2010  | XXXXXX | 
| November 2010  | XXXXXX | 
| December 2010  |  | 
--------------------------------------------- 

空字段可以與已經保存在sales_sheet_entries表中的記錄,但沒有相應的銷售量或乾脆不存在於數據庫上,但查詢必須顯示它。

我的一個制約因素是,我不能把12列直接對應月份在sales_sheet表列表中,因爲客戶的具體要求正在發生變化,他可以要求銷售規模將週期,而不是一個月填寫。

我希望我已經夠清楚了,預先感謝您的幫助&對不起我的英文。

+0

我很驚訝月份和年份存儲,並在單獨的表不會少於...我想要一個日期/日期時間字段分配給出售。然後,您可以根據自己的喜好定義一個包含月份/期間的表格,然後加入期間開始/結束之間的日期時間。我做了這麼多次。 – Fosco 2010-08-11 18:45:11

+0

你可以發佈一些示例數據嗎? – 2010-08-11 18:46:06

回答

1

MySQL沒有遞歸功能,讓你留下了使用數字表絕招 -

  1. 創建一個只持有遞增的數字表 - 易使用AUTO_INCREMENT做:

    DROP TABLE IF EXISTS `example`.`numbers`; 
    CREATE TABLE `example`.`numbers` (
        `id` int(10) unsigned NOT NULL auto_increment, 
        PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    
  2. 使用填充表:

    INSERT INTO NUMBERS 
        (id) 
    VALUES 
        (NULL) 
    

    ...用於爲m任何你需要的值。

  3. 使用DATE_ADD構建的時間列表的基礎上,NUMBERS.id值增加月:

    SELECT x.* 
        FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH) 
          FROM numbers n) x 
    
  4. LEFT JOIN到你的基礎上的日期時間部分的數據表:

    SELECT DATE_FORMAT(x.dt, '%M %Y') AS Month, 
          y.sales_volume 
        FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH) AS dt 
          FROM numbers n) x 
    LEFT JOIN (SELECT ss._product_id, 
            ss._year, 
            sse._month, 
            SUM(sse._quantity) AS sales_volume 
          FROM SALES_SHEET ss 
          JOIN SALES_SHEET_ENTRIES sse ON sse._sheet_id = ss._id 
          GROUP BY ss._product_id, ss._year, sse._month) y ON y._month = MONTH(x.dt) 
                      AND y._year = YEAR(x.dt) 
                      AND y._product_id = ? 
    
+0

非常感謝!!!!!它效果很好:) – ridan 2010-08-12 11:23:10

+0

只是另一個問題:有沒有辦法讓日期'2010-01-01'動態,取決於存儲在工作表中的年份? – ridan 2010-08-12 11:46:20

+0

好的,第二個問題解決了! :) – ridan 2010-08-12 12:47:19

相關問題