[英]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: 但是,如果要两个聚合字段,即
TotalSales
, CommPaid
有两个选择:
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.