【发布时间】:2017-12-06 17:38:09
【问题描述】:
我正在 SQL Server 2008 中编写查询(我相信是 Express?)。我目前收到此错误:
消息 8120,第 16 级,状态 1,第 16 行
列 'AIM.dbo.AggTicket.TotDirectHrs' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
我正在尝试对我们的生产 WIP(在制品)进行历史分析。 我创建了一个独立的日历表(实际上位于同一服务器上名为 BAS 的单独数据库中,不会干扰运行 AIM 数据库的 ERP)。几天来,我已经被一些用于创建运行总查询/视图/表的示例所淹没,所以现在我只打算在 Crystal Reports 2016 中处理这部分。我的想法是我想返回我的日历表中每天每个订单的记录(将来会缩小到仅与 AIM 数据库中的记录匹配的日期)。我认为我需要的价值观是:
- 记录日期(不是唯一的)
- 订单号(每天唯一)
- 预计工作时间
- 截至今天的当前工作的总工作小时数(以防估计的小时数大大低于预算)
- 在所述记录日期计入工作的直接工时总和
- 在所述记录日期出席的员工人数的 COUNT。
- 员工在上述记录日期参加的小时数的总和。
我使用的表格如下:
BAS 数据库:
- dbo.DateDimension - 用于从 1987 年 1 月 1 日到 2036 年 12 月 31 日的完整日历
AIM 数据库:
- dbo.AggAttend - 包含每个员工在给定日期的出勤时间的一条或多条记录(即每个打卡/打卡一条记录。应该等于间接 + 直接人工)
- dbo.AggTicket - 包含一个或多个记录,每个员工的直接工期记入特定订单号
- dbo.ModOrders - 包含每个订单的一条记录,包括预计小时数、开始日期和结束日期(我会担心稍后使用开始日期和结束日期来计算每个日期有多少可用小时数)
这是我在查询中使用的代码:
;WITH OrderTots AS
(
SELECT
AggTicket.OrderNo,
SUM(AggTicket.TotDirectHrs) AS TotActHrs
FROM
AIM.dbo.AggTicket
GROUP BY
AggTicket.OrderNo
)
SELECT
d.Date,
t.OrderNo,
o.EstHrs,
OrderTots.TotActHrs,
SUM(t.TotDirectHrs) OVER (PARTITION BY t.TicketDate) AS DaysDirectHrs,
COUNT(a.EmplCode) AS NumEmployees,
SUM(a.TotHrs) AS DaysAttendHrs
FROM
BAS.dbo.DateDimension d
INNER JOIN
AIM.dbo.AggAttend a ON d.Date = a.TicketDate
LEFT OUTER JOIN
AIM.dbo.AggTicket t ON d.Date = t.TicketDate
LEFT OUTER JOIN
AIM.dbo.ModOrders o ON t.OrderNo = o.OrderNo
LEFT OUTER JOIN
OrderTots ON t.OrderNo = OrderTots.OrderNo
GROUP BY
d.Date, t.TicketDate, t.OrderNo, o.EstHrs,
OrderTots.TotActHrs
ORDER BY
d.Date
当我在 SQL Server Management Studio 2017 中运行该查询时,出现上述错误。
这些是我向社区提出的问题:
- 此错误消息是否正确描述了我的代码中的错误?
- 如果是这样,为什么该错误是错误? (据我所知,所有内容都已包含在聚合函数或 GROUP BY 子句中...smh)
- 编写此查询以使其正常运行的更好方法是什么?
提前向大家表示感谢!
【问题讨论】:
-
欢迎来到 Stack Overflow!我建议您编辑以在帖子附近或顶部总结您的问题。那么 TL;DR 的懒惰程序员可能会更鼓励提供帮助。不要道歉;你可能认识这里一半以上的人。
-
感谢@allanberry,非常感谢您的建议!
标签: sql-server sql-server-2008 ssms common-table-expression