2009-09-25 83 views
0

我需要创建一个销售&委员会的报告总结报告范围

基本上它去(请原谅SaleDate表的blatent疯狂,但我简化了业务逻辑,并在现实中,它其实是有道理的这样)

SELECT agentName, 
     SUM(sales.Amount) AS Gross, 
     SUM(sales.Amount * sales.Commission) AS Commission 
FROM agent 
    INNER JOIN sales ON agent.agentId = sales.agentId 
WHERE sales.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate AND @maxDate) 
GROUP BY agentName 

所以这个查询工作绝对好。当我需要添加第二个日期范围时,会出现问题。

IE浏览器,他们想在2007年的销售比较&并肩销售。

我现在有基本相同的查询,但我已经添加别名销售表,并添加另一个

SELECT agentName, 
     SUM(sales1.Amount) AS Gross1, 
     SUM(sales1.Amount * sales1.Commission) AS Commission1, 
     SUM(sales2.Amount) AS Gross2, 
     SUM(sales2.Amount * sales2.Commission) AS Commission2, 
     SUM(sales3.Amount) AS Gross3, 
     SUM(sales3.Amount * sales3.Commission) AS Commission3 
FROM agent 
    INNER JOIN sales1 ON agent.agentId = sales1.agentId 
    INNER JOIN sales2 ON agent.agentId = sales2.agentId 
    INNER JOIN sales3 ON agent.agentId = sales3.agentId 
WHERE sales1.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate1 AND @maxDate1) OR 
     sales2.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate2 AND @maxDate2) OR 
     sales3.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate3 AND @maxDate3) 
GROUP BY agentName 

此查询但永远走(前20分钟,我取消了),在原来不到一秒钟,如果我只使用两个组,则需要9秒。

有关如何改善此性能的任何想法?

我愿意改变这个查询的设计。

回答

1

如果你的第一个查询工作正常,为什么不只是UNION所有它与新的日期进入第二版?是的,你不会得到一个枢轴输出,但这很容易修复应用层表示代码。

另一种选择是使用CASE。

SELECT agentName, 
SUM (CASE WHEN saleDate.myDate BETWEEN @minDate1 AND @maxDate1 THEN sales.Amount ELSE 0 END) AS Gross1, 
SUM (CASE WHEN saleDate.myDate BETWEEN @minDate1 AND @maxDate1 THEN sales.Commission ELSE 0 END) AS Commission1, 
SUM (CASE WHEN saleDate.myDate BETWEEN @minDate2 AND @maxDate2 THEN sales.Amount ELSE 0 END) AS Gross2, 
SUM (CASE WHEN saleDate.myDate BETWEEN @minDate2 AND @maxDate2 THEN sales.Commission ELSE 0 END) AS Commission2 
FROM agent 
INNER JOIN sales ON agent.agentId = sales.agentId 
GROUP BY agentName 
+0

我结束了使用UNION(需要不到一秒的时间了),我做了一个SELECT AGENTNAME,Gross1,Commission1,NULL,NULL,NULL,NULL FROM。 .. UNION SELECT agentName,NULL,NULL,Gross2,Commission2,NULL,NULL FROM ... 然后做了一个选择从那些和分组和总结 – 2009-09-25 18:52:04

0

检查你的SELECT块,有这么一句话:

SELECT AGENTNAME,
SUM(sales1.Amount)AS Gross1,
SUM(sales1.Amount * sales1.Commission)AS Commission1,
SUM(sales2.Amount)AS Gross2,
SUM(sales2.Amount * sales2.Commission)AS Commission2

并且您正在加入SALES3表,其值不存在于第SELECT子句。这混淆了SQL Server。删除Sales3上的INNER JOIN,它是WHERE块中的OR部分,它将起作用。

将这些项目添加到SELECT块。

+0

这只是一个错误时,将代码添加到问题 – 2009-09-25 18:42:21

1

我会强烈建议拆分到这3次独立的查询,然后通过UNION

0

合并结果这仅仅是一个在黑暗中拍摄W/O任何表信息(规模,模式,索引),但尝试移动连接运算符下面的日期过滤器:

SELECT agentName, 
      SUM(s1.Amount) AS Gross1, 
      SUM(s1.Amount * s1.Commission) AS Commission1, 
      SUM(s2.Amount) AS Gross2, 
      SUM(s2.Amount * s2.Commission) AS Commission2 
    FROM agent 
    INNER JOIN (
     SELECT sales1.agentID, Commission, Amount 
     FROM sales1 WHERE saleId IN (
       SELECT saleId FROM saleDate 
       WHERE saleDate.myDate BETWEEN @minDate1 AND @maxDate1) 
     ) s1 ON agent.agentId = s1.agentId 
    INNER JOIN (
     SELECT sales2.agentID, Commission, Amount 
     FROM sales2 WHERE saleId IN (
       SELECT saleId FROM saleDate 
       WHERE saleDate.myDate BETWEEN @minDate1 AND @maxDate1) 
     ) s2 ON agent.agentId = s2.agentId; 
-- INNER JOIN (
--  SELECT sales3.agentID 
--   FROM sales3 WHERE saleId IN (
--    SELECT saleId FROM saleDate 
--    WHERE saleDate.myDate BETWEEN @minDate1 AND @maxDate1) 
--  ) s3 ON agent.agentId = s3.agentId;