Sql server SQL Server:关于ID是否存在的左外部联接
如果=1,则表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
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表中的一个时间戳,用于消除重复的总和