2013-06-29 28 views
2

我有這個表在mysql中使用函數創建列別名?

sales(productid, sales_date) 

我想每月銷售計數過去的12月份。

如何在列別名(不使用硬編碼)上生成月份名稱?

我嘗試這樣做: -

http://sqlfiddle.com/#!2/ee777/9

但我想以這種格式

productid Oct-12 Nov-12 Dec-12 Jan-13 Feb-13 Mar-13 Apr-13 May-13 
1   0  0  3  4  2  8  2  11  
2   0  5  6  8  2  0  0  0 

我嘗試使用功能DATE_FORMAT(sales_date, '%M')給列別名結果表,但它是 語法錯誤。

select productid,sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 12 month),'%Y%m'),1,0)) 
`12 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 11 month),'%Y%m'),1,0)) 
`11 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 10 month),'%Y%m'),1,0)) 
`10 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 9 month),'%Y%m'),1,0)) 
`9 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 8 month),'%Y%m'),1,0)) 
`8 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 7 month),'%Y%m'),1,0)) 
`7 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 6 month),'%Y%m'),1,0)) 
`6 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 5 month),'%Y%m'),1,0)) 
`5 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 4 month),'%Y%m'),1,0)) 
`4 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 3 month),'%Y%m'),1,0)) 
`3 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 2 month),'%Y%m'),1,0)) 
`2 Months Before`, 
sum(if(DATE_FORMAT(sales_date,'%Y%m')= 
DATE_FORMAT(date_sub(curdate(),interval 1 month),'%Y%m'),1,0)) 
`1 Months Before` 
from sales 
group by productid; 

我怎樣才能得到月份和年份爲別名(如:日 - 10月 - 12)代替12 Months Before11 Months Before等。

回答

1

MySql沒有PIVOT,所以你必須使用條件SUM()

有兩種選擇:

  1. 你做手工,如果週期的數目是有限的,並事先
  2. 知道你可以使用動態SQL動態生成的查詢,然後執行它

的選項1的查詢可能看起來像這樣

SELECT productid 
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201210' THEN 1 ELSE 0 END) `Oct12` 
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201211' THEN 1 ELSE 0 END) `Nov12`  
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201212' THEN 1 ELSE 0 END) `Dec12` 
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201301' THEN 1 ELSE 0 END) `Jan13` 
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201302' THEN 1 ELSE 0 END) `Feb13`  
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201303' THEN 1 ELSE 0 END) `Mar13` 
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201304' THEN 1 ELSE 0 END) `Apr13` 
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201305' THEN 1 ELSE 0 END) `May13`  
     ,SUM(CASE WHEN DATE_FORMAT(sales_date, '%Y%m') = '201306' THEN 1 ELSE 0 END) `Jun13` 
FROM sales 
WHERE sales_date BETWEEN '2012-10-01' AND '2013-06-30' 
GROUP BY productid 

樣品出來放:

 
| PRODUCTID | OCT12 | NOV12 | DEC12 | JAN13 | FEB13 | MAR13 | APR13 | MAY13 | JUN13 | 
------------------------------------------------------------------------------------- 
|   1 |  0 |  0 |  0 |  1 |  1 |  0 |  0 |  2 |  1 | 
|   2 |  1 |  1 |  1 |  0 |  0 |  1 |  1 |  1 |  2 | 

這裏是SQLFiddle演示


現在版本使用動態SQL選項2( PREPAREEXECUTE

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'SUM(CASE WHEN DATE_FORMAT(sales_date, ''%Y%m'') = ''', 
     DATE_FORMAT(period, '%Y%m'), ''' THEN 1 ELSE 0 END) `', DATE_FORMAT(period, '%b%y'), '`' 
    ) 
) INTO @sql 
FROM 
(
    SELECT DATE_FORMAT(sales_date, '%Y-%m-01') period 
     FROM sales 
    WHERE sales_date BETWEEN DATE_FORMAT(CURDATE() - INTERVAL 11 MONTH, '%Y-%m-01') AND CURDATE() 
    GROUP BY DATE_FORMAT(sales_date, '%Y-%m-01') 
) s; 

SET @sql = CONCAT 
('SELECT productid, ', @sql, ' 
    FROM sales 
    WHERE sales_date BETWEEN DATE_FORMAT(CURDATE() - INTERVAL 11 MONTH, ''%Y-%m-01'') AND CURDATE() 
    GROUP BY productid' 
); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

輸出是一樣的。

 
| PRODUCTID | JUL12 | AUG12 | SEP12 | OCT12 | NOV12 | DEC12 | JAN13 | FEB13 | MAR13 | APR13 | MAY13 | JUN13 | 
------------------------------------------------------------------------------------------------------------- 
|   1 |  1 |  2 |  1 |  0 |  0 |  0 |  1 |  1 |  0 |  0 |  2 |  1 | 
|   2 |  0 |  0 |  0 |  1 |  1 |  1 |  0 |  0 |  1 |  1 |  1 |  2 | 

這裏是SQLFiddle演示

+0

感謝您的回答。但我希望獲得過去12個月的產品明智月度銷售計數,而不需要對任何日期進行硬編碼。查詢應該適用於任何日期。 – chetan

+0

這可以很容易地實現。現在考慮到我們今天正在執行這個查詢,您希望從2012-06-29到2013-06-29或2012-06-01到2013-06-29或2012-05-01到2013的確切時間段-05-31'(意思全12個月)'?對此你的問題不清楚。 – peterm

+0

忽略幾天。包括2012-07至2013-06。 – chetan