我有这个查询,其中我想查找当年的销售额和去年的销售额。我不能将它分成2个单独的查询,因为它必须是相同的项目代码。这意味着当年销售中使用的物料代码也必须是去年销售所用的物料代码。
以下代码正常运行,但需要大约8到9分钟才能获取
select p.itemcode,
p.itemdescription,
( select round((SUM(SA.QUANTITY*P.SellingPrice)),2)
from sales s
join product p on s.itemcode=p.itemcode
where YEAR(s.date) = 2013
),
( select round((SUM(SA.QUANTITY * P.SellingPrice)),2)
from sales s
join product p on s.itemcode=p.itemcode
where YEAR(s.date) = 2012
)
from product p
join supplier s on p.suppliercode = s.suppliercode
join currency c on c.countrycode=s.countrycode
join country co on co.countrycode=c.countrycode
JOIN SALES SA ON SA.ITEMCODE=P.ITEMCODE
where c.countrycode = 'NZ'
group by p.itemcode
limit 10
理想情况下,输出应为
Itemcode Itemdescription SalesforCurrentYear SalesforLastYear
GS771516 BUBBLE PARTY MACHINE 1035300.00 2079300.00
GSNBC-025 X'MAS HOUSE 600612.25 1397163.25
GSNBC-031 BRANDENBURGER TOR 741010.75 1572207.25
谢谢!
答案 0 :(得分:0)
遵循以下任何步骤
1.您可以解析您的查询。
2.删除多余的陈述。
3.使用内连接或外连接。
答案 1 :(得分:0)
你在同一范围内销售了三次。我将摆脱其中的两个,这应该有所帮助。此外,就业务逻辑而言,所有这些表似乎都是强制销售的。如果这是真的,你应该使用“内连接”,以便与标准SQL兼容 - 即使它在MySQL中是相同的。
答案 2 :(得分:0)
通过消除两个连接可以简化查询:
select .......
.......
from product p
join supplier s on p.suppliercode = s.suppliercode
JOIN SALES SA ON SA.ITEMCODE=P.ITEMCODE
where s.countrycode = 'NZ'
group by p.itemcode
limit 10
之后,select子句中的两个从属子查询可以简化为一个外连接:
select p.itemcode,
p.itemdescription,
round((SUM( CASE WHEN YEAR(s.date) = 2013
THEN SA.QUANTITY*P.SellingPrice
ELSE 0 END
)),2) As Sum2013,
round((SUM( CASE WHEN YEAR(s.date) = 2012
THEN SA.QUANTITY * P.SellingPrice
ELSE 0 END
)),2) As Sum2012
from product p
join supplier s on p.suppliercode = s.suppliercode
LEFT JOIN SALES SA ON SA.ITEMCODE=P.ITEMCODE
where s.countrycode = 'NZ'
group by p.itemcode
limit 10
请尝试此查询,并告诉我们它的效果。