Sql server SQL Server:关于ID是否存在的左外部联接

Sql server SQL Server:关于ID是否存在的左外部联接,sql-server,tsql,Sql Server,Tsql,如果=1,则表ProviderValueCard中的前三项添加各自的金额。如果表SubscriptionsTV中存在ProviderID,我还试图在我的总分上加50分。GroupID也来自SubscriptionsTV,需要满足该条件。我觉得我需要在两个表的ProviderID列的第二个查询中使用左外部联接 DECLARE @ProviderID int = '1717'; WITH cte as( SELECT TOP 1 ProviderID, Time_Stamp, SUM

如果=1,则表
ProviderValueCard
中的前三项添加各自的金额。如果表
SubscriptionsTV
中存在
ProviderID
,我还试图在我的总分上加50分。GroupID也来自SubscriptionsTV,需要满足该条件。我觉得我需要在两个表的ProviderID列的第二个查询中使用左外部联接

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
订阅电视台

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

您是正确的,这可以通过
左连接来实现,我将使用
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,因此需要区分,使用上面的第二个cte,也可以在
案例中使用相关的子选择


没有注意,
ORDER BY
在使用
TOP
的cte中是可以的。

为什么要投否决票?我不符合什么标准?我没有投反对票,但我不认为你的问题是什么。有时,在显示所需结果的同时显示所获得的结果可以更容易地帮助解决问题。明白了,我所需的结果是,仅当参数
@Provider
也在第二个表“SubscriptionsTV”中时,我的当前总分45加50分。实际上每个ProviderID可能超过1分,我需要选择不同的吗?我在这些ProviderID下也出现了错误,前3个表示不明确,最后一个表示无效列我还在3个SUM大小写后添加了一个逗号,并在WHERE中包含GroupID=2。我忘了给
ProviderID
引用加别名,由于我们正在添加另一个带有
ProviderID
的表,我们必须指定从哪个表中检索值。更新了,关于多提供商id,我认为最好使用第二个cte,目前将更新。不确定您希望在哪里添加
GroupID
标准。感谢您的帮助!我在编辑中添加了我最终得到的内容<代码>事件
是SubTV表中的一个时间戳,用于消除重复的总和