我想像这样每个月1到12使用选择查询。我从互联网子查询格式搜索有点像这样但根据我的查询格式不正确。当我单个月运行此查询时,它显示正确的结果。我想在这样的html表中显示结果 SQL Fiddle
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
答案 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
;
虽然,我有另一种方法可以完成你的任务,它有许多内置的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
;
现在,您可以针对实际数据运行这两个查询,并选择执行时间较短的查询。
希望它有所帮助!