2009-09-25 142 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;