2017-10-21 20 views
1

以下のコードは、私が達成しようとしていることを示してくれることを望みます。集計関数の結果がselect文

問題は、入力選択のどれもが、私はそれを選択しようとするので、私は「無効な列を」取得VatableCashを計算しようとする時間によって解決されていないということです。

ごめんなさい明白なことがあれば私はここでやります。 SQLは私の強い訴訟の一つではありません。

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

あなたはvatable現金を計算する際に、orderlinenetprice、orderlinegrosspriceとtotalcashamountの計算を繰り返し、外側のクエリにvatable現金の計算を移動したり(実際には同じものである)CTEを使用することができます。 –

答えて

2

サブクエリを使用する必要があります。

これを試すことができます。

;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

ありがとう!テストする時間が必要です。すぐにあなたに戻ってきます! –

1

十字架が大好き!便利な余分な列が必要なときはいつでもそれを使用してください。

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

それは小さな問題で、私は 'OrderLineNetPrice'と' OrderLineGrossPrice'でそれをやらなければならないと思っています。もしそうなら、下のサブクエリ解決法を使うことを考えています。私は今でもテストすることができませんので、できる限り私は両方をチェックします。ありがとう! –

+0

希望する場合は、これらの値を追加のクロス適用に追加することができます。 相互適用(OrderLine.NetPrice)をOrderLineNetPriceとして選択し、 合計(OrderLine.GrossPrice)としてOrderLineGrossPrice)をsumsquery –