Sql 合并没有唯一值的行
我有一张这样的桌子:Sql 合并没有唯一值的行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一张这样的桌子: +------+--------+----------+---------+---------+-----------+---------------+----------+ | Temp | UserID | TaskType | DayType | DayPart | TotalTask | PriorityTasks | LineCost | +------+--------+----------+---------+---------+-----------+---
+------+--------+----------+---------+---------+-----------+---------------+----------+
| 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 |
+------+--------+----------+---------+---------+-----------+---------------+-----------+
显然,我在尝试对优先级任务进行分组时搞砸了,因为当它们存在时,不应该创建单独的行,而是在当前行中填充值。因此,该表应如下所示:
+------+--------+----------+---------+---------+-----------+---------------+----------+
| 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
我猜这很简单,但我搜索的所有参考资料都使用了我不想要的东西,或者使用MAX,但我不能在我认为缺少某些东西的地方使用它
CASE WHEN TaskType='PRIORITY' THEN SUM(TaskCount) OVER (PARTITION BY UserID, TaskType, DayType, DayPart) END as PriorityTasks
但我当然不能这样做,因为我得到了错误:
*窗口函数不能在另一个窗口函数或聚合的上下文中使用。
*
提前谢谢
Temp | UserID | TaskType | DayType | DayPart | TotalTask | PriorityTasks | LineCost
---: | -----: | -------: | :------ | :------ | --------: | ------------: | :-------
0 | 1001 | 1 |平日|上午| 155 | 155 | 125.30
0 | 1001 | 1 |平日|下午| 125 | 125 | 101.58
0 | 1001 | 1 |周末|上午| 45 | 45 | 97.55
0 | 1001 | 1 |周末|下午| 54 | 54 | 54.38
1 | 1001 | 1 |工作日|下午| 125 |空| 51.81
警告:通过聚合或其他集合操作消除空值。
dbfiddle为什么其中一个按
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演示:
返回:
+----+------+--------+----------+---------+---------+-----------+---------------+----------+
| 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 |
+----+------+--------+----------+---------+---------+-----------+---------------+----------+
为什么你要把所有人都联合起来两次?长的一个是用于工作日任务的另一个是工作日任务哦,我明白了,再看看你救了我一次!谢谢你的帮助,这正是我所需要的。我知道我肯定错过了一些直接的东西。@aantiix很乐意帮忙!