2012-04-26 33 views
5

Bằng cách viết các truy vấn sau đâytruy vấn sql để thiết lập năm như tên cột

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 

tôi có thể nhận được kết quả sau

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 

Thay vào đó tôi muốn kết quả theo cách sau

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

Tôi không thực sự giỏi về sql và không có đầu mối về cách đặt năm làm tên cột. Cần trợ giúp.

LƯU Ý :: Cơ sở dữ liệu của tôi có 2 bảng. bảng Sales có cột ngày trong đó có những ngày khác nhau như 2012-03-01, 2012/04/02, 2011/07/03, vân vân ...

Trả lời

5

Có lẽ một cái gì đó như thế này:

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

Nếu bạn muốn các năm khác và vẫn tổng hợp chúng. Sau đó, bạn có thể làm điều này:

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

Nếu bạn có rất nhiều năm và bạn không muốn giữ lại trên năm thêm. Sau đó, bạn cần phải sử dụng sql động. Điều đó có nghĩa rằng bạn concat một varchar của sql và sau đó thực hiện nó.

Tài liệu tham khảo hữu ích:

+0

và nếu bạn có nhiều năm hơn? [số chưa biết] – Zyku

+2

Sau đó, bạn cần sử dụng sql động. – Arion

+0

hoặc bạn có thể sử dụng trục – Zyku

1

Câu trả lời ở trên sẽ làm việc nhưng thêm một trường hợp trong năm bao giờ có thể hoặc không có thể phù hợp . Nếu bạn đang ở trên một nền tảng PHP bạn có thể thay đổi cách bố trí của mảng hiện tại của bạn như vậy

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

này sẽ làm cho một mảng như sau:

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 
     ) 

) 

Cũng thay đổi truy vấn ban đầu của bạn để gán tốt hơn tên các biến:

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 

Ở trên giả định kết quả mảng mysql của bạn trông giống như sau:

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 
     ) 

) 
0

đây:

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 

Tất nhiên, bạn sẽ phải thêm bao nhiêu tham gia như nhiều năm bạn muốn tìm kiếm thông qua ...

Các vấn đề liên quan