2014-08-29 27 views
0

ProviderValueCard的前三個項目如果= 1,則分別添加它們各自的數量。如果ProviderID存在於表SubscriptionsTV中,我也試圖將50添加到TotalScore。 GroupID也來自需要滿足條件的SubscriptionsTV。我相信我需要在來自兩個表的ProviderID列的第二個查詢中有一個左外連接。SQL Server:是否存在ID的左外部聯接

DECLARE @ProviderID int = '1717'; 

WITH cte as(
SELECT TOP 1 ProviderID, Time_Stamp, 
     SUM(CASE WHEN [AdditionalReports] = '1' THEN 5 ELSE 0 END) as AdditionalReports, 
     SUM(CASE WHEN [UniqueReportRequests] = '1' THEN 15 ELSE 0 END) as UniqueReportsRequests, 
     SUM(CASE WHEN [SurveyCompleted] = '1' THEN 30 ELSE 0 END) as SurveyCompleted 
     --IF @ProviderID EXISTS SUM(THEN 50 ELSE 0 END) 

     FROM ProviderValueCard 
     WHERE ProviderID = @ProviderID 
     GROUP BY Time_Stamp, ProviderID 
     ORDER BY Time_Stamp DESC 
    ) 
     SELECT ProviderID, Time_Stamp, (AdditionalReports + UniqueReportsRequests + SurveyCompleted) AS TotalScore 
     FROM cte 
     --WHERE GroupID = 2 

回報

ProviderID Time_Stamp    TotalScore 
----------- ----------------------- ----------- 
1717  2014-08-28 13:03:30.593 45 

ProviderValueCard表

ProviderID AdditionalReports UniqueReportRequests SurveyCompleted Time_Stamp 
----------- ----------------- -------------------- --------------- ----------------------- 
1717  0     1     1    2014-08-28 13:03:30.593 

SubscriptionsTV表

ProviderID GroupID 
----------- ----------- 
1717  2 

我最後的結果是這樣的:

DECLARE @ProviderID int = '1717'; 

WITH cte as(
SELECT TOP 1 a.ProviderID, Time_Stamp, 
     SUM(CASE WHEN [AdditionalReports] = '1' THEN 5 ELSE 0 END) as AdditionalReports, 
     SUM(CASE WHEN [UniqueReportRequests] = '1' THEN 15 ELSE 0 END) as UniqueReportsRequests, 
     SUM(CASE WHEN [SurveyCompleted] = '1' THEN 30 ELSE 0 END) as SurveyCompleted, 
     MAX(CASE WHEN b.ProviderID IS NULL THEN 0 ELSE 50 END) as SubscriptionExists 

     FROM ProviderValueCard a 
     LEFT JOIN SubscriptionsTV b 
     ON a.ProviderID = b.ProviderID 
     WHERE a.ProviderID = @ProviderID AND GroupID = 2 
     GROUP BY Time_Stamp, a.ProviderID, event 
     ORDER BY event DESC, Time_Stamp DESC 
    ) 
     SELECT ProviderID, Time_Stamp, (AdditionalReports + UniqueReportsRequests + SurveyCompleted + SubscriptionExists) AS TotalScore 
     FROM cte 
+0

爲什麼downvote?我不符合什麼標準? – user3749447 2014-08-29 15:22:55

+0

我沒有downvote,但我不認爲這很清楚你的問題是什麼。有時顯示所需的結果以及所獲得的結果可以幫助解決問題。 – 2014-08-29 15:32:59

+0

只有當參數'@ Provider'也在第二個表'SubscriptionsTV'中時,我希望的結果是將50添加到我目前的TotalScore 45。 – user3749447 2014-08-29 15:39:14

回答

2

你是正確的,這可以用LEFT JOIN來完成,我會使用MAX()CASE聲明:

DECLARE @ProviderID int = '1717';  
WITH Subs AS (SELECT DISTINCT ProviderID 
       FROM SubscriptionsTV 
       ) 
    ,cte AS (SELECT TOP 1 a.ProviderID, Time_Stamp, 
         SUM(CASE WHEN [AdditionalReports] = '1' THEN 5 ELSE 0 END) as AdditionalReports, 
         SUM(CASE WHEN [UniqueReportRequests] = '1' THEN 15 ELSE 0 END) as UniqueReportsRequests, 
         SUM(CASE WHEN [SurveyCompleted] = '1' THEN 30 ELSE 0 END) as SurveyCompleted, 
         MAX(CASE WHEN b.ProviderID IS NULL THEN 0 ELSE 50 END) as SubscriptionExists  
       FROM ProviderValueCard a 
       LEFT JOIN Subs b 
       ON a.ProviderID = b.ProviderID 
       WHERE a.ProviderID = @ProviderID 
       GROUP BY Time_Stamp, ProviderID 
       ORDER BY Time_Stamp DESC 
      ) 
SELECT ProviderID, Time_Stamp, (AdditionalReports + UniqueReportsRequests + SurveyCompleted + SubscriptionExists) AS TotalScore 
FROM cte 

更新:由於多個providerID的可能存在,需要DISTINCT,採用了一個2 CTE上面也可以使用CASE語句中的相關子選擇。

沒有注意,ORDER BY在使用TOP時很好。

+0

實際上每個ProviderID可能有多於1個,我是否需要選擇不同的?我也收到這些ProviderID的http://i.imgur.com/sCpMYCo.png下的錯誤,前3個說不明確,最後說無效列 – user3749447 2014-08-29 15:52:17

+0

我還在3個SUM CASE後面添加了一個逗號幷包含GroupID = 2在WHERE。 – user3749447 2014-08-29 15:54:00

+0

我忘了給別名'ProviderID'引用,因爲我們正在用'ProviderID'添加另一個表,我們必須指定從哪個表中檢索值。這是更新的,關於多個提供商ID,我認爲最好用第二個cte,現在會更新。 – 2014-08-29 16:19:55