我有一个这样的表:
+------+--------+----------+---------+---------+-----------+---------------+----------+
| Temp | UserID | TaskType | DayType | DayPart | TotalTask | PriorityTasks | LineCost |
+------+--------+----------+---------+---------+-----------+---------------+----------+
| 0 | 1001 | 1 | Weekday | AM | 155 | NULL | 125.30 |
| 0 | 1001 | 1 | Weekday | AM | 155 | 155 | 125.30 |
| 0 | 1001 | 1 | Weekday | PM | 125 | NULL | 101.58 |
| 0 | 1001 | 1 | Weekday | PM | 125 | 125 | 101.58 |
| 1 | 1001 | 1 | Weekday | PM | 125 | NULL | 51.81 |
| 0 | 1001 | 1 | Weekend | AM | 45 | 45 | 97.55 |
| 0 | 1001 | 1 | Weekend | PM | 54 | NULL | 54.38 |
| 0 | 1001 | 1 | Weekend | PM | 54 | 54 | 54.38 |
+------+--------+----------+---------+---------+-----------+---------------+----------+
我显然搞砸了我试图对优先级任务进行分组的地方,因为它不应该在它们存在时创建单独的行,而是填写当前行中的值。所以表格应该如下所示:
+------+--------+----------+---------+---------+-----------+---------------+-----------+
| Temp | UserID | TaskType | DayType | DayPart | TotalTask | PriorityTasks | TotalCost |
+------+--------+----------+---------+---------+-----------+---------------+-----------+
| 0 | 1001 | 1 | Weekday | AM | 155 | 155 | 125.30 |
| 0 | 1001 | 1 | Weekday | PM | 125 | 125 | 101.58 |
| 1 | 1001 | 1 | Weekday | PM | 125 | NULL | 51.81 |
| 0 | 1001 | 1 | Weekend | AM | 45 | 45 | 97.55 |
| 0 | 1001 | 1 | Weekend | PM | 54 | 54 | 54.38 |
+------+--------+----------+---------+---------+-----------+---------------+-----------+
我的查询如下:
SELECT DISTINCT Temp, UserID, TaskType, DayType, DayPart,
SUM(TaskCount) OVER (PARTITION BY UserID, TaskType, DayType, DayPart) as TotalTasks,
CASE WHEN TaskType='PRIORITY' THEN SUM(TaskCount) OVER (PARTITION BY UserID, TaskType, DayType, DayPart) END as PriorityTasks,
SUM(Cost) OVER (PARTITION BY Temp, UserID, TaskType, DayType, DayPart) as LineCost
FROM
(
SELECT * FROM
(
SELECT Temp, TaskType, UserID, TaskType, DayType = 'Weekend', DayPart,
TaskCount=SUM(WeekendTasks), Cost=CONVERT(DECIMAL(10,2),SUM((CostPerWeek / TasksPerWeek) * WeekendTasks))
FROM #Temp_CostPerAffiliateByTemp3
GROUP BY Temp, TaskType, UserID, TaskType, DayPart, CostPerWeek
UNION ALL
SELECT Temp, TaskType, UserID, TaskType, DayType = 'Weekday', DayPart,
Tasks=SUM(WeekdayTasks), Cost=CONVERT(DECIMAL(10,2),SUM((CostPerWeek / TasksPerWeek) * WeekdayTasks))
FROM #Temp_CostPerAffiliateByTemp3
GROUP BY Temp, TaskType, UserID, TaskType, DayPart, CostPerWeek
) AS Y
WHERE (TaskCount > 0)
) AS X
GROUP BY X.UserID, X.TaskType, X.DayType, X.DayPart, X.Temp, X.TaskCount, X.TaskType, X.Cost
我猜它很简单,但是我使用 STUFF 搜索引用的所有内容都不是我正在寻找的,或者使用 MAX 但我不能在我认为缺少某些内容的地方使用它
CASE WHEN TaskType='PRIORITY' THEN SUM(TaskCount) OVER (PARTITION BY UserID, TaskType, DayType, DayPart) END as PriorityTasks
但是我当然不能这样做,因为我收到错误:
*窗口函数不能在另一个窗口函数或聚合的上下文中使用。 *
提前致谢!
最佳答案
为什么其中一个按 Temp
分区,而其他则不分区?
SELECT ....
...SUM(TaskCount) OVER (PARTITION BY UserID, TaskType, DayType, DayPart) as TotalTasks,
...SUM(TaskCount) OVER (PARTITION BY UserID, TaskType, DayType, DayPart) END as PriorityTasks,
...SUM(Cost) OVER (PARTITION BY Temp, UserID, TaskType, DayType, DayPart) as LineCost
FROM
...
看起来你可以使用max()
,除非我遗漏了一些东西......
select
id = min(id)
, Temp
, UserID
, TaskType
, DayType
, DayPart
, TotalTask
, PriorityTasks = max(PriorityTasks)
, LineCost
from t
group by
Temp
, UserID
, TaskType
, DayType
, DayPart
, TotalTask
, LineCost
order by min(id)
rextester 演示:http://rextester.com/UERVTJ42678
返回:
+----+------+--------+----------+---------+---------+-----------+---------------+----------+
| id | Temp | UserID | TaskType | DayType | DayPart | TotalTask | PriorityTasks | LineCost |
+----+------+--------+----------+---------+---------+-----------+---------------+----------+
| 1 | 0 | 1001 | 1 | Weekday | AM | 155 | 155 | 125,30 |
| 3 | 0 | 1001 | 1 | Weekday | PM | 125 | 125 | 101,58 |
| 5 | 1 | 1001 | 1 | Weekday | PM | 125 | NULL | 51,81 |
| 6 | 0 | 1001 | 1 | Weekend | AM | 45 | 45 | 97,55 |
| 7 | 0 | 1001 | 1 | Weekend | PM | 54 | 54 | 54,38 |
+----+------+--------+----------+---------+---------+-----------+---------------+----------+
关于sql - 组合没有唯一值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43007919/