2011-06-08 72 views
2

我目前使用這個SQL語句返回由誰完成每個記錄計數(RFI):我可以將兩列合併爲一列,然後將它們的值計算爲一列嗎?

SELECT Completed_By, COUNT(DISTINCT Unique_ID) AS RFICount FROM RFI_ 
WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
GROUP BY Completed_By 

這將返回一個數據集,像下面這樣:

Completed_By  RFICount 
------------  --------- 
SMITH, Bob  1 
DOE, John  15 
WARNER, Jack  11 

這是我多麼希望它看起來。但是,有人可以是完成或協助完成記錄(RFI)的主要或次要人員。無論他們是完成記錄(Completed_By)還是輔助它(Assisting_Analyst),我都想在一列中全部顯示。

當我使用下面的SQL語句,它顯示了這些作爲單獨的,當他們需要進行彙總:

SELECT Completed_By, Assisting_Analyst, COUNT(DISTINCT Unique_ID) AS RFICount 
FROM RFI_ WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
GROUP BY Completed_By, Assisting_Analyst 

這將返回以下類型的輸出:

Completed_By  Assisting_Analyst  RFICount 
------------  -----------------  -------- 
SMITH, Bob  NULL     1 
DOE, John  NULL     15 
WARNER, Jack  NULL     7 
WARNER, Jack  SMITH, Bob   4 

因爲鮑勃·史密斯協助傑克華納有四個記錄(RFIs),有一個獨立的行創建。但我只是希望每個拿到個人信用,並讓它在一列中顯示出來,就像這樣:

Completed_By  RFICount 
------------  --------- 
SMITH, Bob  5 
DOE, John  15 
WARNER, Jack  11 

在上面的例子中,四個記錄他們的工作就共同記入他們兩個。當然,這意味着一些記錄被計數兩次,但這是我想要的這個應用程序。

我嘗試過工會和一堆其他的東西,但它要麼不給我我想要的東西,因爲我想顯示或它給了我一個沒有數據的錯誤。我知道DISTINCT必須去,但不知道如何完全做到這一點。這是在SQL Server 2008 R2中完成的。幫幫我?

+0

是否有可能有人出現在一些列第二助理(如'Assising_analyst'),而不是顯示爲第一助理(如'Completed_By')中的任何行? – 2011-06-08 21:19:14

+0

這是不太可能的,但是,這是可能的。 – 2011-06-09 16:22:31

+0

然後我第一次嘗試將不計入那些:( – 2011-06-09 16:23:53

回答

4
SELECT t.Completed_By, COUNT(DISTINCT t.Unique_ID) AS RFICount 
    FROM (SELECT Completed_By, Unique_ID 
       FROM RFI_ 
       WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
      UNION ALL 
      SELECT Assisting_Analyst AS Completed_By, Unique_ID 
       FROM RFI_ 
       WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
        AND Assisting_Analyst IS NOT NULL) t 
    GROUP BY t.Completed_By 
+0

這個偉大的工程謝謝 – 2011-06-08 21:25:16

0

這樣做的最好方法可能是彙總,避免了子查詢,並可能在大型數據集上執行得更好。

SELECT Completed_By, Assisting_Analyst, COUNT(DISTINCT Unique_ID) AS RFICount 
FROM RFI_ WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
AND Assisting_Analyst IS NULL and Completed_By IS NOT NULL 
GROUP BY Completed_By, Assisting_Analyst WITH ROLLUP 

ROLLUP意味着總值應該包含在Completed_By行中,因此排除了where子句中的輔助行。

+0

我覺得要注意,此查詢將添加一個額外發送以下信息非常重要:! Completed_By Assisting_Analyst RFICount ----- ------- ----------------- -------- SMITH,Bob NULL 1 DOE,John NULL 15 WARNER,Jack NULL 7 WARNER,Jack SMITH,Bob 4 WARNER,Jack全部11 全部史密斯,鮑勃4 顯然,格式化代碼現在不適合我... – 2011-06-08 21:13:39

+0

你確定嗎?如果你看看where子句,它明確地阻止了最低級別組的返回(即Assisting Analyst引起加法的那些組)。它永遠不會返回Completing,Assisting對,只是完成小計。 – 2011-06-08 21:18:40

+2

我認爲你的查詢永遠不會返回任何有助理分析師的記錄(它只會查看只有主分析員的行)這將最終顯示傑克華納的賬戶有7個完成的記錄,而不是完整的記錄11。 – 2011-06-08 21:21:44

0
SELECT a.Completed_By 
    , COUNT(DISTINCT a.Unique_ID) 
     + (SELECT COUNT(DISTINCT b.Unique_ID) 
      FROM RFI_ b 
      WHERE b.Date_Submitted BETWEEN '20110101' AND '20110630' 
      AND b.Assisting_Analyst = a.Completed_By 
     ) 
     AS RFICount 
FROM RFI_ a 
WHERE a.Date_Submitted BETWEEN '20110101' AND '20110630' 
GROUP BY a.Completed_By 

闖闖:

SELECT COALESCE(first.Completed_By, second.Assisting_Analyst) 
     AS Completed_By 
    , COALESCE(first.RFICount,0) + COALESCE(second.RFICount,0) 
     AS RFICount 
FROM 
    (SELECT Completed_By 
     , COUNT(DISTINCT Unique_ID) AS RFICount 
    FROM RFI_ 
    WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
    GROUP BY Completed_By 
) AS first 
FULL JOIN 
    (SELECT Assisting_Analyst 
     , COUNT(DISTINCT Unique_ID) AS RFICount 
    FROM RFI_ 
    WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
    GROUP BY Assisting_Analyst 
) AS second 
ON first.Completed_By = second.Assisting_Analyst 
相關問題