Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并没有唯一值的行_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

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很乐意帮忙!