我遇到了问题我被用户提出了问题。
概述。
用户需要统计信息如下:
|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个小时,所以我确定我错过了一些东西和/或使用了错误的功能。工作中不断的分心也无济于事
衷心感谢任何和所有建议。
答案 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