Sql query to set the year as a column name

Writing down the following query

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

I can get the following result

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

Instead, I want to get the result as follows

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

I am not very good at sql and don’t know how to set years as column names. Help is needed.

NOTE :: My database contains 2 tables. The sales table has a date column that has different dates, such as 2012-03-01, 2012-04-02, 2011-07-03, and so on ...

+5
source share
3 answers

Maybe something like this:

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

EDIT

If you want other years and summarize them anyway. Then you can do this:

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. , varchar sql .

:

+5

, . 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
        )

)
+1

:

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

Of course, you will need to add as many connections as you want to search for how many years ...

0
source

All Articles