1

私は次のSQLクエリを持っています

SELECT
i.catalogid, i.itemname,
CASE WHEN o.oshippeddate is not null 
          AND  o.oshippeddate between @Date1 AND @Date2
    THEN ISNULL(i.F2,0)
    ELSE 0 END +
CASE WHEN o.oshippeddate2 is not null 
          AND o.oshippeddate2 between @Date1 AND @Date2
    THEN ISNULL(i.F3,0) 
    ELSE 0 END +
CASE WHEN o.oshippeddate3 is not null 
          AND  o.oshippeddate3 between @Date1 AND @Date2
     THEN ISNULL(i.F4,0) 
     ELSE 0 END AS amount, 
    amount*i.ekprice EK,
    amount * (i.unitprice
              - ((i.unitprice/((o.otax/100)+1))
              - o.odiscount-o.oshipcost-o.coupondiscount) VK
FROM orders o 
INNER JOIN oitems i 
ON i.orderid = o.orderid 

選択したい最後の2つの列を見ると、それ自体がselect caseステートメントを使用して生成された新しい列である列量から生成されています。SQLは初めてですが、どうすればそのようなものを機能させることができるのでしょうか。 、基本的にはinvalid column name amount

4

3 に答える 3

2

クエリが処理されるまで列の量は存在しないため、サブクエリを提案してから乗算を行います

お気に入り:

SELECT AA.*,(amount*ekprice)  as EK,
        (amount*(unitprice-((unitprice/((otax/100)+1))-odiscount-oshipcost-coupondiscount)) as VK
FROM (
    SELECT
        i.catalogid,i.itemname,i.ekprice,i.unitprice,o.otax,o.odiscount,o.oshipcost,o.coupondiscount
        CASE WHEN o.oshippeddate is not null AND  o.oshippeddate  between @Date1 AND @Date2
             THEN ISNULL(i.F2,0)
             ELSE 0 END +
        CASE WHEN o.oshippeddate2 is not null AND o.oshippeddate2 between @Date1 AND @Date2
             THEN ISNULL(i.F3,0) 
             ELSE 0 END +
        CASE WHEN o.oshippeddate3 is not null AND  o.oshippeddate3 between @Date1 AND @Date2
             THEN ISNULL(i.F4,0) 
             ELSE 0 END AS amount   
    FROM 
        orders o 
        INNER JOIN oitems i ON i.orderid = o.orderid 
)AS AA

編集:

大量のCASEステートメントを使用したこの種のクエリは、大量のデータが処理されるとパフォーマンスが大幅に低下することを覚えておいてください。したがって、これをサーバークライアント環境で使用する場合は、その前にクライアント側で計算を行うことをお勧めします。表示されています

于 2012-12-17T08:11:10.887 に答える
1

使用CROSS APPLY

SELECT
    i.catalogid, i.itemname, x.amount,
    x.amount * i.ekprice EK,
    x.amount * (i.unitprice
              - ((i.unitprice/((o.otax/100)+1))
              - o.odiscount-o.oshipcost-o.coupondiscount) VK
FROM orders o 
INNER JOIN oitems i 
ON i.orderid = o.orderid 
CROSS APPLY (
  SELECT
    CASE WHEN o.oshippeddate is not null 
              AND  o.oshippeddate between @Date1 AND @Date2
        THEN ISNULL(i.F2,0)
        ELSE 0 END +
    CASE WHEN o.oshippeddate2 is not null 
              AND o.oshippeddate2 between @Date1 AND @Date2
        THEN ISNULL(i.F3,0) 
        ELSE 0 END +
    CASE WHEN o.oshippeddate3 is not null 
              AND  o.oshippeddate3 between @Date1 AND @Date2
         THEN ISNULL(i.F4,0) 
         ELSE 0 END AS amount
) x

@Jesterによって提案された副選択方法とおそらく同じくらい効率的であるため、これはおそらくより保守可能であることがわかります。

于 2012-12-17T08:42:29.137 に答える
1

内部クエリを使用して、必要なすべての列を選択します。

SELECT catalogid, itemname,
    amount*ekprice EK,
    amount*(unitprice-((unitprice/((otax/100)+1))-odiscount-oshipcost-coupondiscount) VK
FROM (
SELECT
i.catalogid,
i.itemname,
i.ekprice,
i.unitprice,
o.otax,
o.odiscount,
o.oshipcost,
o.coupondiscount,
CASE WHEN o.oshippeddate between @Date1 AND @Date2
     THEN ISNULL(i.F2,0)
     ELSE 0 END +
CASE WHEN o.oshippeddate2 between @Date1 AND @Date2
     THEN ISNULL(i.F3,0) 
     ELSE 0 END +
CASE WHEN o.oshippeddate3 between @Date1 AND @Date2
     THEN ISNULL(i.F4,0) 
     ELSE 0 END AS amount
FROM orders o INNER JOIN oitems i 
ON i.orderid = o.orderid 
) x

また、nullのすべてのテストは必要ありません。列がnullの場合、「間」にはならないので、それらを削除しました。

于 2012-12-17T09:25:55.407 に答える