繁体   English   中英

Group By子句中的无效列名错误

[英]Invalid column name error in Group By clause

我正在尝试为rdlc报告创建Sp。 我在其中使用许多用户定义的函数进行计算。 但是,当我尝试在group by子句中使用函数别名时,出现错误“消息207,级别16,状态1,行14无效的列名'CommPaid'”,这是我的查询

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."

将您在SELECT中使用的复杂函数也放到GROUP BY中:

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

关键是,您的别名在GROUP BY处理期间不可用。 SELECT通常是要执行的语句的最新部分。

删除GROUP BY CommPaid

GROUP BY Employee.FirstName, CommissionStructure.Name

因为它本身也是一个Aggregate字段

但是,如果要两个聚合字段,即TotalSalesCommPaid有两个选择:

选项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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM