sql查询将year设置为列名

Ani*_*nil 6 mysql sql

通过编写以下查询

SELECT item_name, YEAR( DATE ) , SUM( item_sold_qty ) 
FROM item
JOIN sales ON item.id = sales.item_number
GROUP BY YEAR( DATE ) , item_name
ORDER BY item_name
Run Code Online (Sandbox Code Playgroud)

我能够得到以下结果

item_name   YEAR( DATE )    SUM( item_sold_qty )
pencil          2011              22
pencil          2012              44
eraser          2012              22
eraser          2011              11
pen             2012              66
pen             2011              33
nib             2012              88
nib             2011              44
Run Code Online (Sandbox Code Playgroud)

相反,我希望以下列方式得到结果

 item_name      2011    2012
    pencil       22      44            
    eraser       11      22                   
    pen          33      66                  
    nib          44      88
Run Code Online (Sandbox Code Playgroud)

我不是很擅长sql,并且不知道如何将年份设置为列名.需要帮忙.

注意 ::我的数据库有2个表.销售表的日期列有不同的日期,如2012-03-01,2012-04-02,2011-07-03,等......

Ari*_*ion 5

也许是这样的:

SELECT 
    item_name, 
    SUM(CASE WHEN YEAR( DATE )=2011 THEN item_sold_qty ELSE 0 END) AS '2011',
    SUM(CASE WHEN YEAR( DATE )=2012 THEN item_sold_qty ELSE 0 END) AS '2012'
FROM 
    item
JOIN sales ON item.id = sales.item_number
GROUP BY
    item_name
ORDER BY 
    item_name
Run Code Online (Sandbox Code Playgroud)

编辑

如果你想要其他年份并仍然总结它们.然后你可以这样做:

SELECT 
    item_name, 
    SUM(CASE WHEN YEAR( DATE )=2011 THEN item_sold_qty ELSE 0 END) AS '2011',
    SUM(CASE WHEN YEAR( DATE )=2012 THEN item_sold_qty ELSE 0 END) AS '2012',
    SUM(CASE WHEN NOT YEAR( DATE ) IN (2011,2012) THEN item_sold_qty ELSE 0 END) AS 'AllOtherYears'
FROM 
    item
JOIN sales ON item.id = sales.item_number
GROUP BY
    item_name
ORDER BY 
    item_name
Run Code Online (Sandbox Code Playgroud)

EDIT2

如果你有很多年,而且你不想继续增加岁月.然后你需要使用动态sql.这意味着您连接sql的varchar然后执行它.

有用的参考文献:

  • 然后你需要使用动态sql. (2认同)