2017-10-21 2 views
1

Hoffentlich sollte der Code unten zeigen, was ich versuche zu erreichen.Aggregatfunktion führt zu Select-Anweisung

Das Problem ist, dass keiner der Eingabe wählt bis zu dem Zeitpunkt VatableCash berechnet werden, so bekomme ich "ungültige Spalte", wenn Sie versuchen, es auszuwählen.

Entschuldigung, wenn es etwas offensichtlich ist, kann ich hier tun. SQL ist nicht einer meiner starken Anzüge.

select 
    OrderHeader.ID, 
    sum(OrderLine.NetPrice) as OrderLineNetPrice, 
    sum(OrderLine.GrossPrice) as OrderLineGrossPrice, 
    sum(
     case when PaymentOption_ID = 8 
      then Payment.Amount 
      else 0 
     end 
    ) as TotalCashAmount, 
    ((OrderLineGrossPrice - OrderLineNetPrice)/OrderLineGrossPrice) * TotalCashAmount as VatableCash 
    from OrderHeader 
    inner join Payment on Payment.OrderHeader_ID = OrderHeader.ID 
    inner join OrderLine on OrderLine.OrderHeader_ID = OrderHeader.ID 
    group by OrderHeader.ID 
+0

Sie könnten die Berechnungen für orderlinenetprice, orderlinegrossprice und totalcashamount wiederholen, wenn vatable Bargeld Berechnung der Berechnung der vatable bar zu einer äußeren Abfrage verschieben oder einen CTE verwenden (die in der Tat ist die gleiche Sache). –

Antwort

2

Sie müssen Unterabfrage verwenden.

Sie können dies versuchen.

;WITH CTE AS 
(
    select 
     OrderHeader.ID, 
     sum(OrderLine.NetPrice) as OrderLineNetPrice, 
     sum(OrderLine.GrossPrice) as OrderLineGrossPrice, 
     sum(
      case when PaymentOption_ID = 8 
       then Payment.Amount 
       else 0 
      end 
     ) as TotalCashAmount 
    from OrderHeader 
     inner join Payment on Payment.OrderHeader_ID = OrderHeader.ID 
     inner join OrderLine on OrderLine.OrderHeader_ID = OrderHeader.ID 
    group by OrderHeader.ID 
) 
SELECT *, 
    ((OrderLineGrossPrice - OrderLineNetPrice)/OrderLineGrossPrice) * TotalCashAmount as VatableCash 
FROM CTE 
+0

Danke! Brauchen Sie etwas Zeit zum Testen. Werde bei Ihnen bald wieder melden! –

1

Liebe das Kreuz anwenden! Verwenden Sie es immer dann, wenn Sie einige praktische zusätzliche Spalten benötigen.

select 
    OrderHeader.ID, 
    sum(OrderLine.NetPrice) as OrderLineNetPrice, 
    sum(OrderLine.GrossPrice) as OrderLineGrossPrice, 
    TotalCashAmount, 
    ((OrderLineGrossPrice - OrderLineNetPrice)/OrderLineGrossPrice) * TotalCashAmount as VatableCash 
    from OrderHeader 
    inner join Payment on Payment.OrderHeader_ID = OrderHeader.ID 
    inner join OrderLine on OrderLine.OrderHeader_ID = OrderHeader.ID 
    cross apply (select sum(
     case when PaymentOption_ID = 8 
      then Payment.Amount 
      else 0 
     end 
    )) as subquery(TotalCashAmount) 
    group by OrderHeader.ID 
+0

Kleines Problem damit ist, dass ich denke, dass ich es auch mit 'OrderLineNetPrice' und' OrderLineGrossPrice' machen muss und wenn das der Fall ist, denke ich über die Verwendung der Unterabfrage-Lösung unten nach. Ich kann jetzt nicht testen, also werde ich sie beide überprüfen, wenn ich kann. Vielen Dank! –

+0

Sie können diese zu einem zusätzlichen Kreuz hinzufügen, wenn Sie möchten: Kreuz anwenden (wählen Sie Summe (OrderLine.NetPrice) als OrderLineNetPrice, Summe (OrderLine.GrossPrice) als OrderLineGrossPrice) als sumsquery –