2013-10-29 74 views
2

我正在尝试为rdlc报表创建一个Sp。我在其中使用许多用户定义的函数进行计算。但是,当我试图通过条款采取功能别名组是givng错误“消息207,级别16,状态1,行14 无效的列名称CommPaid“”下面是我的查询Group By子句中列名错误

SELECT  Employee.FirstName AS Tech, CommissionStructure.Name AS Commission, '$ ' + CONVERT(varchar(8), SUM(WorkOrderPayment.PaymentTotal)) 
        AS TotalSales --, ISNULL(SUM(PurchaseOrder.AmountPaidToSupplier), 0) AS POAmount, ISNULL(SUM(WorkOrderPayment.TOC),0) AS TOC, 
        -- SUM(dbo.GetCashInvoiceAmount(WorkOrderPayment.WorkOrderPaymentID)) AS CashInvoice, ISNULL(SUM(dbo.GetSecTechAmount(WorkOrderPayment.WorkOrderID)),0) AS SecTechAmount 
        ,dbo.GetCommission(SUM(WorkOrderPayment.PaymentTotal),SUM(dbo.GetCashInvoiceAmount(WorkOrderPayment.WorkOrderPaymentID)),ISNULL(SUM(PurchaseOrder.AmountPaidToSupplier), 0),ISNULL(SUM(WorkOrderPayment.TOC),0),ISNULL(SUM(dbo.GetSecTechAmount(WorkOrderPayment.WorkOrderID)),0),CommissionStructure.CommissionPercentage) As CommPaid 

FROM   WorkOrder INNER JOIN 
        WorkOrderPayment ON WorkOrder.WorkOrderID = WorkOrderPayment.WorkOrderID INNER JOIN 
        Employee ON WorkOrder.empID = Employee.empID INNER JOIN 
        CommissionStructure ON Employee.CommissionStructureID = CommissionStructure.CommissionStructureID INNER JOIN 
        [User] ON Employee.UserID = [User].UserID LEFT OUTER JOIN 
        PurchaseOrder ON WorkOrderPayment.WorkOrderPaymentID = PurchaseOrder.WorkOrderPaymentID 

WHERE  (WorkOrder.OrderStatusID = 3) AND (WorkOrder.Deleted = 0) AND ([User].Active = 1) AND (CONVERT(varchar, WorkOrder.ScheduleStartTime, 101) 
        >= '10/01/2013') AND (CONVERT(varchar, WorkOrder.ScheduleStartTime, 101) <= '10/24/2013') 

GROUP BY Employee.FirstName, CommissionStructure.Name,CommPaid 

当我删除函数别名时,它会给出另一个显而易见的错误。

"Msg 8120, Level 16, State 1, Line 4 
Column 'CommissionStructure.CommissionPercentage' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause." 
+0

查看[SELECT]的MSDN页面的逻辑处理顺序部分(http://technet.microsoft.com/en-us/) library/ms189499.aspx),并指出'GROUP BY'在'SELECT'前被逻辑*处理。这就是为什么你不能引用在你的GROUP BY中的'SELECT'子句中引入的别名。 –

回答

3

将您正在使用的SELECT还融入了复杂的功能GROUP BY:

GROUP BY 
... 
,dbo.GetCommission(... 

问题是,您的别名在GROUP BY过程中不可用咝声。 SELECT通常是要执行的语句的最新部分...

+0

Radim您可以在上面的答案评论中看到错误。 – Haris

+0

好吧,我只是设法了解你的GetCommision函数的内容。正如我目前看到的那样,您应该将执行分为两个查询。第一个GROUP BY * Employee.FirstName,CommissionStructure.Name *返回三个值。然后在结果上面创建一个GROUP BY,将** CommPaid **的内容作为已处理的* column *提供。我们正在收回的提示非常清楚。我们试图将SUMed值传递给函数...依赖于GROUP BY。这只是一次运行就不能成功。我们首先必须分组才能正确得到SUM –

+0

@Haris - 只是一个方面的评论 - 你应该避免在堆栈溢出时引用位置的答案。我相信投票(和相同的投票计数随机化,我相信)可以并且确实会改变答案的显示顺序 - 所以当人们阅读您的评论时,目前“上面的答案”可能不会。我通常会建议一个链接(这是每个答案下面的共享选项给你的),或者至少指的是你想要引用的答案的用户。 –

0

GROUP BY

GROUP BY Employee.FirstName, CommissionStructure.Name 

删除​​,因为它本身也是一个Aggregate

但是,如果你希望两个总场,也就是TotalSales,​​- 你有两个选项:

选项1:包括在复杂的功能时,您GROUP BY

GROUP BY Employee.FirstName, CommissionStructure.Name, dbo.GetCommission(SUM(WorkOrderPayment.PaymentTotal),SUM(dbo.GetCashInvoiceAmount(WorkOrderPayment.WorkOrderPaymentID)),ISNULL(SUM(PurchaseOrder.AmountPaidToSupplier), 0),ISNULL(SUM(WorkOrderPayment.TOC),0),ISNULL(SUM(dbo.GetSecTechAmount(WorkOrderPayment.WorkOrderID)),0),CommissionStructure.CommissionPercentage) 

选项2:让两个查询和JOIN两个,如:

SELECT A.Tech, A.Commission, A.TotalSales, B.CommPaid FROM 
(
SELECT Employee.EmpID, Employee.FirstName AS Tech, CommissionStructure.Name AS Commission, '$ ' + CONVERT(varchar(8), SUM(WorkOrderPayment.PaymentTotal)) 
       AS TotalSales 

FROM   WorkOrder INNER JOIN 
       WorkOrderPayment ON WorkOrder.WorkOrderID = WorkOrderPayment.WorkOrderID INNER JOIN 
       Employee ON WorkOrder.empID = Employee.empID INNER JOIN 
       CommissionStructure ON Employee.CommissionStructureID = CommissionStructure.CommissionStructureID INNER JOIN 
       [User] ON Employee.UserID = [User].UserID LEFT OUTER JOIN 
       PurchaseOrder ON WorkOrderPayment.WorkOrderPaymentID = PurchaseOrder.WorkOrderPaymentID 

WHERE  (WorkOrder.OrderStatusID = 3) AND (WorkOrder.Deleted = 0) AND ([User].Active = 1) AND (CONVERT(varchar, WorkOrder.ScheduleStartTime, 101) 
       >= '10/01/2013') AND (CONVERT(varchar, WorkOrder.ScheduleStartTime, 101) <= '10/24/2013') 

GROUP BY Employee.FirstName, CommissionStructure.Name 
) A 

INNER JOIN 
SELECT A.Tech, A.Commission, A.TotalSales, B.CommPaid 
(
SELECT Employee.EmpID, Employee.FirstName AS Tech, dbo.GetCommission(SUM(WorkOrderPayment.PaymentTotal),SUM(dbo.GetCashInvoiceAmount(WorkOrderPayment.WorkOrderPaymentID)),ISNULL(SUM(PurchaseOrder.AmountPaidToSupplier), 0),ISNULL(SUM(WorkOrderPayment.TOC),0),ISNULL(SUM(dbo.GetSecTechAmount(WorkOrderPayment.WorkOrderID)),0),CommissionStructure.CommissionPercentage) As CommPaid 


FROM   WorkOrder INNER JOIN 
       WorkOrderPayment ON WorkOrder.WorkOrderID = WorkOrderPayment.WorkOrderID INNER JOIN 
       Employee ON WorkOrder.empID = Employee.empID INNER JOIN 
       CommissionStructure ON Employee.CommissionStructureID = CommissionStructure.CommissionStructureID INNER JOIN 
       [User] ON Employee.UserID = [User].UserID LEFT OUTER JOIN 
       PurchaseOrder ON WorkOrderPayment.WorkOrderPaymentID = PurchaseOrder.WorkOrderPaymentID 

WHERE  (WorkOrder.OrderStatusID = 3) AND (WorkOrder.Deleted = 0) AND ([User].Active = 1) AND (CONVERT(varchar, WorkOrder.ScheduleStartTime, 101) 
       >= '10/01/2013') AND (CONVERT(varchar, WorkOrder.ScheduleStartTime, 101) <= '10/24/2013') 

GROUP BY Employee.FirstName, CommissionStructure.Name 
) B 
ON A.EmpID = B.EmpID 
+0

使用选项1“Msg 144,Level 15,State 1,Line 14时出错” 不能在用于GROUP BY子句的group by列表的表达式中使用聚合或子查询。 – Haris

+0

当使用第二个选项时,它也给出了与第二个查询相关的一些语法错误。 “Msg 156,Level 15,State 1,Line 21 关键字'SELECT'附近的语法不正确 Msg 156,Level 15,State 1,Line 23 关键字'SELECT'附近的语法不正确 Msg 102,Level 15 ,状态1,行37 ')'附近语法错误。 “ – Haris