Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中使用函数创建列别名?_Mysql_Sql_Pivot_Alias - Fatal编程技术网

在mysql中使用函数创建列别名?

在mysql中使用函数创建列别名?,mysql,sql,pivot,alias,Mysql,Sql,Pivot,Alias,我有这张桌子 sales(productid, sales_date) 我想得到过去12个月的月销售额 如何在列别名上生成月份名称(无需硬编码) 我试过这个:- 但是我想要这个格式的结果表 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

我有这张桌子

sales(productid, sales_date)
我想得到过去12个月的月销售额

如何在列别名上生成月份名称(无需硬编码)

我试过这个:-

但是我想要这个格式的结果表

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\u格式(sales\u 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;

如何将月份和年份作为别名(例如:-Oct-12)来代替
12个月之前的
11个月之前的
,等等。

MySql没有
PIVOT
,因此您必须使用有条件的
SUM()

有两种选择:

  • 如果周期数是有限的且事先已知,则可以手动执行此操作
  • 您可以使用动态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 | 输出是相同的

    | 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 | |产品ID | 7月12日| 8月12日| 10月12日| 11月12日| 12月13日| 2月13日| 4月13日| 5月13日| 6月13日| ------------------------------------------------------------------------------------------------------------- | 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 |
    这里是演示

    谢谢你的回答。但我想得到过去12个月的产品月销售额,而不需要硬编码任何日期。查询应该适用于任何日期。这很容易实现。现在,假设我们今天正在执行此查询,您想要的确切时间是
    2012-06-29到2013-06-29
    2012-06-01到2013-06-29
    2012-05-01到2013-05-31
    (意味着整整12个日历月)`?你的问题在那方面还不清楚,别理天。包括2012-07年至2013-06年。见更新答案。这显然只适用于带有动态SQL的版本。不客气。我很高兴我能帮上忙:)顺便说一句,下一个逻辑步骤是将这个查询包装在一个存储过程中,以隐藏其复杂性,并且不使客户端代码混乱。 | 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 |