4

Sp for rdlc レポートを作成しようとしています。計算に多くのユーザー定義関数を使用しています。しかし、group by 句で関数エイリアスを取得しようとすると、「Msg 207、Level 16、State 1、Line 14 Invalid column name '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."
4

2 に答える 2

5

SELECT で使用している複雑な関数を GROUP BY にも配置します。

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

ポイントは、GROUP BY 処理中にエイリアスを使用できないことです。SELECT は通常、実行されるステートメントの最後の部分です...

于 2013-10-29T06:29:22.990 に答える
1

CommPaidで削除GROUP BY

GROUP BY Employee.FirstName, CommissionStructure.Name

Aggregateそれ自体がフィールドでもあるので

ただし、2 つの集計フィールド、つまりTotalSales, CommPaid- が必要な場合は、次の 2 つのオプションがあります。

オプション 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)

オプション 2JOIN : 次のように、2つのクエリと2 つを作成します。

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
于 2013-10-29T06:28:08.440 に答える