【问题标题】:sql query to set year as column namesql查询将年份设置为列名
【发布时间】:2012-05-07 00:53:08
【问题描述】:

通过编写以下查询

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

我可以得到以下结果

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

相反,我希望通过以下方式获得结果

 item_name      2011    2012
    pencil       22      44            
    eraser       11      22                   
    pen          33      66                  
    nib          44      88

我不太擅长 sql,也不知道如何将年份设置为列名。 需要帮助。

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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    可能是这样的:

    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
    

    编辑

    如果你想要其他年份并且仍然对它们求和。然后你可以这样做:

    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
    

    EDIT2

    如果您有很多年并且不想继续增加年数。然后你需要使用动态sql。这意味着您将 sql 的 varchar 连接起来,然后执行它。

    有用的参考资料:

    【讨论】:

    • 如果你还有更多年? [未知号码]
    • 那你需要使用动态sql。
    • 如果他使用的是 mssql。使用动态 sql 的数据透视是最好的解决方案。你实际上可以在 mysql 中做一些支点。如果你有兴趣看这里en.wikibooks.org/wiki/MySQL/Pivot_table
    • @Arion 感谢您的帮助。我真的不知道我们可以按照您显示的方式编写查询。很高兴学习新东西。但是如果我们有更多年,那么您说我们需要使用动态sql。这到底是什么意思?如果我有从 2001 年到 2010 年的年份,我是否需要继续添加案例?
    • 我们可以使用这个 SELECT '1' AS YEAR(NOW()) 或类似的东西吗?
    【解决方案2】:

    上面的答案会起作用,但每年添加一个案例可能合适,也可能不合适。 如果您在 PHP 平台上,您可以像这样更改现有数组的布局

    foreach($items as $item)
    {
        $item_names[$item[item_name]][$item[year]] += $item[item_sold_qty];
    }
    

    这将创建一个数组,如下所示:

    Array
    (
        [pencil] => Array
            (
                [2011] => 22
                [2012] => 44
            )
    
        [eraser] => Array
            (
                [2012] => 22
                [2011] => 11
            )
    
        [pen] => Array
            (
                [2012] => 66
                [2011] => 33
            )
    
        [nib] => Array
            (
                [2012] => 88
                [2011] => 44
            )
    
    )
    

    同时更改您的原始查询,为变量分配更好的名称:

    SELECT item_name, YEAR( DATE ) as year , SUM( item_sold_qty ) as item_sold_qty
    FROM item
    JOIN sales ON item.id = sales.item_number
    GROUP BY YEAR( DATE ) , item_name
    ORDER BY item_name
    

    以上假设您的 mysql 结果数组如下所示:

    Array
    (
        [0] => Array
            (
                [item_name] => pencil
                [year] => 2011
                [item_sold_qty] => 22
            )
    
        [1] => Array
            (
                [item_name] => pencil
                [year] => 2012
                [item_sold_qty] => 44
            )
    
        [2] => Array
            (
                [item_name] => eraser
                [year] => 2012
                [item_sold_qty] => 22
            )
    
        [3] => Array
            (
                [item_name] => eraser
                [year] => 2011
                [item_sold_qty] => 11
            )
    
        [4] => Array
            (
                [item_name] => pen
                [year] => 2012
                [item_sold_qty] => 66
            )
    
        [5] => Array
            (
                [item_name] => pen
                [year] => 2011
                [item_sold_qty] => 33
            )
    
        [6] => Array
            (
                [item_name] => nib
                [year] => 2012
                [item_sold_qty] => 88
            )
    
        [7] => Array
            (
                [item_name] => nib
                [year] => 2011
                [item_sold_qty] => 44
            )
    
    )
    

    【讨论】:

      【解决方案3】:

      这里:

      SELECT
          i.item_name, 
          SUM(s1.item_sold_qty) AS '2011',
          SUM(s2.item_sold_qty) AS '2012'
      
      FROM item i
           LEFT JOIN sales s1 ON (i.id = s1.item_number AND YEAR(s1.DATE) = 2011)
           LEFT JOIN sales s2 ON (i.id = s2.item_number AND YEAR(s2.DATE) = 2012)
      
      GROUP BY i.item_name
      ORDER BY i.item_name
      

      当然,您必须添加尽可能多的连接,以搜索多少年...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        • 2019-01-22
        • 2017-01-08
        • 2012-05-16
        • 2021-02-28
        相关资源
        最近更新 更多