Mysql多选查询以按月显示总结果

时间:2017-11-25 18:37:55

标签: mysql sql

我想像这样每个月1到12使用选择查询。我从互联网子查询格式搜索有点像这样但根据我的查询格式不正确。当我单个月运行此查询时,它显示正确的结果。我想在这样的html表中显示结果 SQL Fiddle

Html table Format

SELECT 
(SELECT SUM(`current_sales`) FROM `orders` WHERE YEAR(order_date) ='2017' AND MONTH(order_date) ='10' GROUP BY  pro_id) AS October,
(SELECT SUM(`current_sales`) FROM `orders` WHERE YEAR(order_date) ='2017' AND MONTH(order_date) ='11' GROUP BY  pro_id) AS November,
(SELECT SUM(`current_sales`) FROM `orders`WHERE YEAR(order_date) ='2017' AND MONTH(order_date) ='12' GROUP BY  pro_id)  AS December 

1 个答案:

答案 0 :(得分:0)

你走在正确的道路上。但是,由于您希望每个月sum()获得current_sales,因此您不应在子查询中使用Group by,因为它将返回多行。而是仅使用where条件来获取与当前使用pro_id子句执行查询的Group by相同的行。

以下查询将起作用:

select tmp.pro_id,
       tmp.product_name,
       tmp.nsp,       
       tmp.Jan,
       tmp.Feb,
       tmp.Mar,
       tmp.Apr,
       (tmp.Jan+tmp.Feb+tmp.Mar+tmp.Apr) as Q1,
       tmp.May,
       tmp.Jun,
       tmp.Jul,
       tmp.Aug,
       (tmp.May+tmp.Jun+tmp.Jul+tmp.Aug) as Q2,
       tmp.Sep,
       tmp.Oct,
       tmp.Nov,
       tmp.`Dec`,
       (tmp.Sep+tmp.Oct+tmp.Nov+tmp.`Dec`) as Q3
From       
( 
SELECT o.pro_id,
       p.product_name,
       p.nsp,
(case when coalesce(sum(month(order_date) = 1),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='1')
 else 0
 end
 ) as Jan,
 (case when coalesce(sum(month(order_date) = 2),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='2')
 else 0
 end
 ) as Feb,
(case when coalesce(sum(month(order_date) = 3),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='3')
 else 0
 end
 ) as Mar,
 (case when coalesce(sum(month(order_date) = 4),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='4')
 else 0
 end
 ) as Apr,
 (case when coalesce(sum(month(order_date) = 5),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='5')
 else 0
 end
 ) as May,
 (case when coalesce(sum(month(order_date) = 6),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='6')
 else 0
 end
 ) as Jun,
 (case when coalesce(sum(month(order_date) = 7),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='7')
 else 0
 end
 ) as Jul,
(case when coalesce(sum(month(order_date) = 8),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='8')
 else 0
 end
 ) as Aug,
(case when coalesce(sum(month(order_date) = 9),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='9')
 else 0
 end
 ) as Sep,
(case when coalesce(sum(month(order_date) = 10),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='10')
 else 0
 end
 ) as Oct,
 (case when coalesce(sum(month(order_date) = 11),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='11')
 else 0
 end
 ) as Nov,
(case when coalesce(sum(month(order_date) = 12),0) <> 0
      then
          (SELECT SUM(`current_sales`) FROM `orders` WHERE pro_id = o.pro_id and YEAR(order_date) ='2017' AND MONTH(order_date) ='12')
 else 0
 end
 ) as `Dec`
from products p
inner join orders o
on p.pro_id = o.pro_id
group by o.pro_id
)tmp
group by tmp.pro_id
;

Click here for DEMO

虽然,我有另一种方法可以完成你的任务,它有许多内置的Mysql内置函数,如Group_concat()Substring_Index()等。

看看另一种方法:

select tmp2.pro_id,
       tmp2.product_name,
       tmp2.nsp,
       tmp2.Jan,
       tmp2.Feb,
       tmp2.Mar,
       tmp2.Apr,
       (tmp2.Jan+tmp2.Feb+tmp2.Mar+tmp2.Apr) as Q1,
       tmp2.May,
       tmp2.Jun,
       tmp2.Jul,
       tmp2.Aug,
       (tmp2.May+tmp2.Jun+tmp2.Jul+tmp2.Aug) as Q2,
       tmp2.Sep,
       tmp2.Oct,
       tmp2.Nov,
       tmp2.`Dec`,
       (tmp2.Sep+tmp2.Oct+tmp2.Nov+tmp2.`Dec`) as Q3
from
(
select tmp.pro_id,
       tmp.product_name,
       tmp.nsp,            
(case when coalesce(sum(tmp.month=1),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (1,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Jan,
(case when coalesce(sum(tmp.month=2),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (2,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Feb,
(case when coalesce(sum(tmp.month=3),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (3,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Mar,
(case when coalesce(sum(tmp.month=4),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (4,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Apr,
(case when coalesce(sum(tmp.month=5),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (5,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as May,
(case when coalesce(sum(tmp.month=6),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (6,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Jun,
(case when coalesce(sum(tmp.month=7),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (7,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Jul,
(case when coalesce(sum(tmp.month=8),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (8,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Aug,
(case when coalesce(sum(tmp.month=9),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (9,
                     Group_concat(tmp.month order by tmp.month separator ',')
                 )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Sep,
(case when coalesce(sum(tmp.month=10),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (10,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Oct,                      
(case when coalesce(sum(tmp.month=11),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (11,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as Nov,
(case when coalesce(sum(tmp.month=12),0) <> 0 
      then
        substring_index
        (
           substring_index
            (
             Group_concat(tmp.total order by tmp.month separator ','),
             ',',             
               (find_in_set
                    (12,
                     Group_concat(tmp.month order by tmp.month separator ',')
                    )
               )
             ), 
            ',',
          -1                
        )
     else 0
end
) as `Dec`
from       
(
select o.pro_id,
       p.product_name,
       p.nsp,
       sum(o.current_sales) as total,
       month(order_date) as month
from
products p
inner join orders o
on p.pro_id = o.pro_id
group by o.pro_id,month(order_date)
)tmp
group by tmp.pro_id
)tmp2
group by tmp2.pro_id
;

Click here for Demo

现在,您可以针对实际数据运行这两个查询,并选择执行时间较短的查询。

希望它有所帮助!