我有两个查询不同表并返回类似字段的SQL查询:
User - Role - Category - Points
和
User - Role - Category - Target
我的查询如下:
select
acs.UserID,
acs.RoleID,
acs.CategoryID,
sum(acs.Points)
from acs
和
select
tb.UserID,
tb.RoleID,
tb.CategoryID,
sum(
(
(DATEDIFF(dd, (case when @start >= tb.StartDate then @start else tb.StartDate end), (case when @end <= tb.EndDate then @end else tb.EndDate end)) + 1)
) * tb.dailyMed
) as Target
from tb
我想最终得到的是这样的:
User - Role - Category - Points - Target
每个单独的查询运行时间不到1秒,但是当我尝试使用内部联接组合它们时,运行需要3分钟。
我希望有一种更有效的方式来做这件事,但我似乎无法找到一个。
*编辑 我的内部联接看起来像这样
select
acs.UserID,
acs.RoleID,
acs.CategoryID,
sum(acs.Points),
t.Target
from
dbo.ActualCacheSale acs
inner join
(select
tb.UserID,
tb.RoleID,
tb.CategoryID,
sum(
(
(DATEDIFF(dd, (case when @start >= tb.StartDate then @start else tb.StartDate end), (case when @end <= tb.EndDate then @end else tb.EndDate end)) + 1)
) * tb.dailyMed
) as Target
from
dbo.TargetBucket tb
) t on
t.UserID = acs.UserID and
t.RoleID = acs.RoleID and
t.CategoryID = acs.CategoryID
答案 0 :(得分:6)
尝试
select
aa.UserId,
aa.Roleid,
aa.CategoryId
Sum(aa.Points) as Points,
Sum(aa.Target) as Target
from
(
select
acs.UserID,
acs.RoleID,
acs.CategoryID,
sum(acs.Points) as Points
null as target
from acs
union all
select
tb.UserID,
tb.RoleID,
tb.CategoryID,
0 as points
sum(
(
(DATEDIFF(dd, (case when @start >= tb.StartDate then @start else tb.StartDatee end),
(case when @end <= tb.EndDate then @end else tb.EndDate end)) + 1)
) * tb.dailyMed
) as Target
from tb) as aa
group by
aa.UserId,
aa.Roleid,
aa.CategoryId
答案 1 :(得分:0)
也许我错过了一些东西,但我不确定你是如何在没有分组的情况下获得总和的。无论如何,这是我的看法 - 希望我没有错过任何东西:
SELECT P.UserID ,
P.RoleID ,
P.CategoryID ,
P.Points ,
T.Target
FROM ( SELECT acs.UserID ,
acs.RoleID ,
acs.CategoryID ,
SUM(acs.Points) Points
FROM acs
GROUP BY acs.UserID ,
acs.RoleID ,
acs.CategoryID
) P
CROSS APPLY ( SELECT tb.UserID ,
tb.RoleID ,
tb.CategoryID ,
SUM(( (DATEDIFF(dd, ( CASE WHEN @start >= tb.StartDate THEN @start
ELSE tb.StartDate
END ), ( CASE WHEN @end <= tb.EndDate THEN @end
ELSE tb.EndDate
END )) + 1) ) * tb.dailyMed) AS Target
FROM TB
WHERE TB.UserID = P.UserID
AND TB.RoleID = P.RoleID
AND TB.CategoryID = P.CategoryID
GROUP BY tb.UserID ,
tb.RoleID ,
tb.CategoryID
) T
答案 2 :(得分:-2)
您可以发布您用于内部联接的查询吗?通常,如果连接列上有有用的索引,则查询应该运行良好。
如果没有,一个好的选择是创建两个临时表,1来存储每个查询的结果。然后在连接列的临时表上创建索引。使用临时表运行最终查询。