2017-11-25 60 views
1

我想要像这样使用每月1到12的select查询。我从互联网搜索子查询格式是这样的小,但它是不正确的格式根据我的查询。当我运行这个查询单个月时,它显示正确的结果。我想显示HTML表格的结果是这样 SQL FiddleMysql多重选择查询按月显示总计结果

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

This SQLFiddle-> http://sqlfiddle.com/#!9/feb9a/1 – user3030814

回答

0

你是在正确的道路上。但是,因为您想每月获得sum()current_sales,所以您不应在子查询中使用Group by,因为它将返回多行。取而代之的是,只要where条件为当前正在使用Group by子句执行的查询获取相同的pro_id行。

下面的查询将工作:

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

虽然,我对你的任务的另一种方法,其具有类似Group_concat()与MySQL的许多内置功能庞大的查询,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

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

希望它有帮助!

+0

请验证两种方法并检查两个演示。随意问任何疑问。 –

+0

非常感谢@Harshil Doshi。你太棒了。 – user3030814

+0

我应用此查询它工作正常,但我想添加一个WHERE子句WHERE d_id = 4,所以它应该只显示这个结果,但是当我应用它显示每个d_id相同的结果。我该怎么办?再次感谢 – user3030814