在嵌套和连接的Select中使用case计算2个聚合

时间:2014-12-19 12:48:10

标签: tsql sql-server-2012

我遇到了问题我被用户提出了问题。
概述。
用户需要统计信息如下:

  

|TEAM | TARGET | WEEKLY | MONTHLY | |-----|------- |--------|---------| |AAA | 80 | 15 | 59 | |BBB | 80 | 12 | 35 | |CCC | 80 | 13 | 50 | |DDD | 80 | 6 | 39 | |EEE | 80 | 7 | 28 | |FFF | 80 | 11 | 30 | |GGG | 80 | 10 | 28 | |HHH | 80 | 8 | 48 |

我现在正在使用代码:

DECLARE @StartExDate datetime
DECLARE @EndExDate datetime
declare @ThisWeekNow int
SET @StartExDate = (SELECT(CONVERT(DATETIME, (SELECT DATEADD(DAY, 1, EOMONTH(GETDATE(),-1))))))
SET @EndExDate = (SELECT(CONVERT(DATETIME, (SELECT DATEADD(DAY, 1, EOMONTH(GETDATE()))))))
SET @ThisWeekNow = (SELECT DATEPART(wk, GETDATE()))

Select 
    tt.Team
    ,tt.Target
    ,W_Total
    ,M_Total
From [Team_Targets] tt
        join (
                Select
                count(0) as M_Total,
                Case When DATEPART(wk,s.Date) = @ThisWeekNow Then count(1) end  as W_Total,
                m.FERef
                FROM [tr_type] s
                join [tr] c
                on s.ItemID = c.ItemID
                join [a] a
                on c.ParentID = a.ItemID
                join [M] m
                on a.ERef = m.ERef and a.MN = m.MN
                where s.Date between @StartExDate and @EndExDate
                        and (s.DRef = 1546 or s.DRef = 1658) 
                group by m.FERef, s.Date
                ) t
    on tt.team = t.FERef
    group by tt.team, tt.Target, t.M_Total, t.W_Total

我得到的是这个:

|TEAM | TARGET | WEEKLY | MONTHLY |
|-----|------- |--------|---------|
|AAA  | 80     | NULL   | 1       |
|AAA  | 80     | 1      | 1       |
|BBB  | 80     | NULL   | 1       |
|BBB  | 80     | 1      | 1       |
|CCC  | 80     | NULL   | 1       |
|CCC  | 80     | 1      | 1       |
|DDD  | 80     | NULL   | 1       |
|DDD  | 80     | 1      | 1       |
|EEE  | 80     | NULL   | 1       |
|EEE  | 80     | 1      | 1       |
|FFF  | 80     | NULL   | 1       |
|FFF  | 80     | 1      | 1       |
|GGG  | 80     | NULL   | 1       |
|GGG  | 80     | 1      | 1       |
|HHH  | 80     | NULL   | 1       |
|HHH  | 80     | 1      | 1       |

我有点难过。
如果我放弃一个聚合,我得到一些有用的东西 问题是Team_Targets是一个用户表,而其余的是来自我们使用的非现实系统,因此joins和嵌套selects。 有没有办法获得理想的结果?任何方式都可以。 我这个星期每天睡3个小时,所以我确定我错过了一些东西和/或使用了错误的功能。工作中不断的分心也无济于事 衷心感谢任何和所有建议。

1 个答案:

答案 0 :(得分:0)

试试这个。使每个FERef的子查询只返回一行。

DECLARE @StartExDate DATETIME DECLARE @EndExDate DATETIME DECLARE @ThisWeekNow INT SET @StartExDate = (SELECT (CONVERT(DATETIME, (SELECT DATEADD(DAY, 1, EOMONTH(GETDATE(), -1)))))) SET @EndExDate = (SELECT (CONVERT(DATETIME, (SELECT DATEADD(DAY, 1, EOMONTH(GETDATE())))))) SET @ThisWeekNow = (SELECT DATEPART(wk, GETDATE()))

SELECT tt.Team, tt.Target, W_Total, M_Total FROM [Team_Targets] tt JOIN ( SELECT SUM(1) AS M_Total, SUM(CASE WHEN DATEPART(wk, s.Date) = @ThisWeekNow THEN 1 ELSE NULL END) AS W_Total, m.FERef FROM [tr_type] s JOIN [tr] c ON s.ItemID = c.ItemID JOIN [a] a ON c.ParentID = a.ItemID JOIN [M] m ON a.ERef = m.ERef AND a.MN = m.MN WHERE s.Date BETWEEN @StartExDate AND @EndExDate AND (s.DRef = 1546 OR s.DRef = 1658) GROUP BY m.FERef--, s.Date ) t ON tt.team = t.FERef GROUP BY tt.team, tt.Target, t.M_Total, t.W_Total