sql - 组合没有唯一值的行

标签 sql sql-server sql-server-2008-r2

我有一个这样的表:

+------+--------+----------+---------+---------+-----------+---------------+----------+
| 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/

相关文章:

database - PostgreSql + 将 bool 值类型转换为字符类型

c# - SQL 索引表连接

sql - 独特的航类组合与总乘客

sql - 将字符串拆分为两列

sql - t-sql 返回错误代码与 RaiseError

sql - 将 SQL SUM 加在一起的首选语法

mysql - phpmyadmin 插入 csv 文件

sql-server - SQL Server 截断加密值

sql-server - 我的 SQL2008 实例在哪个端口上运行?

sql - 是否可以在 SQL Server 中的 where 或 having 子句中使用自定义字段?