简体   繁体   English

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

[英]Invalid column name error in Group By clause

I'm trying to create a Sp for rdlc report. 我正在尝试为rdlc报告创建Sp。 In which I'm using many user defined function for calculation. 我在其中使用许多用户定义的函数进行计算。 But when I'm trying to take function alias in group by clause it is givng an error "Msg 207, Level 16, State 1, Line 14 Invalid column name 'CommPaid'" Below is my Query 但是,当我尝试在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

When I removed function alias then it give an other error which is obvious. 当我删除函数别名时,它会给出另一个明显的错误。

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

Place the complex function you are using in the SELECT also into the GROUP BY: 将您在SELECT中使用的复杂函数也放到GROUP BY中:

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

The point is, that your alias is not available during the GROUP BY processing. 关键是,您的别名在GROUP BY处理期间不可用。 SELECT is usually the latest part of the statement to be executed... SELECT通常是要执行的语句的最新部分。

Remove CommPaid in GROUP BY 删除GROUP BY CommPaid

GROUP BY Employee.FirstName, CommissionStructure.Name

because by itself it is also an Aggregate field 因为它本身也是一个Aggregate字段

But if you want the two aggregate fields, that is, TotalSales , CommPaid - you have two options: 但是,如果要两个聚合字段,即TotalSalesCommPaid有两个选择:

Option 1 : Include the complex function in your GROUP BY 选项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)

Option 2 : Make two Query and JOIN the two, like: 选项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.

相关问题 添加到分组依据时,无效的列名称错误 - Invalid column name error when adding to Group By 使用分组依据时出现无效的列名错误 - Invalid column name error while using group by SQL Group By子句(无效列)? - SQL Group By clause (invalid column)? where子句中的列别名给出了无效的列名错误 - Column aliases in where clause giving invalid column name error 联合子句中的列名无效 - Invalid Column Name in union clause 使用where子句会导致无效的列名错误 - using where clause causes invalid column name error 列 'City.Name' 在 select 列表中无效,因为它不包含在聚合 function 或 GROUP BY 子句中 - Column 'City.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause 列 'seller.seller_Name' 在 select 列表中无效,因为它不包含在聚合 function 或 GROUP BY 子句中 - Column 'seller.seller_Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause 在选择列表中,列“ tbl_Stock.Item_Name”无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中 - Column 'tbl_Stock.Item_Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause 列“Users.Name”在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中 - Column 'Users.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM