1

だから私は以下のコードを持っています

SELECT PICK_SO_NUMBER, CUSTOMER, SO_PRODUCT, DO_QUANTITY, DO_PACKING, DO_DATE,
COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
DO_QUANTITY-INVOICED_QTY AS NOT_INVOICED, 
INVOICE_PACKING 
FROM VW_TRAFFIC_PO_SIDE
WHERE  DO_QUANTITY > INVOICED_QTY OR (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL)

合体の下の行は、INVOICED_QTY から DO_QUANTITY を減算することを想定していますが、INVOICED_QTY が NULL の場合、0 を減算するのではなく、NULL を減算するため、INVOICED_QTY が null の場合、新しい列は null を返します。

私は複数のことを試しました:ケースに合体させ、合体をINVOICEDと書いてから減算式でINVOICEDを使用して、減算と同じ行で合体を使用してみました(間にコンマを入れずに、これが解決策だと感じました)最適に動作しますが、コンパイルできませんでした)

4

2 に答える 2

3

ALIASでは使用できませんWHERE

SELECT  PICK_SO_NUMBER, 
        CUSTOMER, 
        SO_PRODUCT, 
        DO_QUANTITY, 
        DO_PACKING, 
        DO_DATE,
        COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
        DO_QUANTITY-INVOICED_QTY AS NOT_INVOICED, 
        INVOICE_PACKING 
FROM    VW_TRAFFIC_PO_SIDE
-- note that INVOICE_QTY in WHERE  DO_QUANTITY > INVOICED_QTY
-- does not compare the result of COALESCE(INVOICED_QTY, 0)
-- but to the original value of INVOICE_QTY
WHERE  DO_QUANTITY > COALESCE(INVOICED_QTY, 0) OR 
        (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL)

理由は次のとおりです。

  • FROM 句
  • WHERE句
  • GROUP BY 句
  • HAVING 句
  • SELECT句
  • ORDER BY 句

このWHERE節は、SELECT( ALIAS の設定が行われる) 節の後に来ます。

ただし、本当にそのエイリアスを使用したい場合は、サブクエリでラップします。

SELECT  *
FROM
(
    SELECT  PICK_SO_NUMBER, 
            CUSTOMER, 
            SO_PRODUCT, 
            DO_QUANTITY, 
            DO_PACKING, 
            DO_DATE,
            COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
            DO_QUANTITY-INVOICED_QTY AS NOT_INVOICED, 
            INVOICE_PACKING 
    FROM    VW_TRAFFIC_PO_SIDE
) s
WHERE    DO_QUANTITY > INVOICED_QTY OR 
        (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL)
于 2013-01-14T05:10:41.247 に答える
3

select-list と WHERE 句で同じエイリアス 'invoiced_qty' を使用すると混乱します。減算の値は生の列値であり、前の選択リスト項目から結合された値ではありません。同じことが WHERE 句にも当てはまります。

SELECT PICK_SO_NUMBER, CUSTOMER, SO_PRODUCT, DO_QUANTITY, DO_PACKING, DO_DATE,
       COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
       DO_QUANTITY - COALESCE(INVOICED_QTY, 0) AS NOT_INVOICED, 
       INVOICE_PACKING 
  FROM VW_TRAFFIC_PO_SIDE
 WHERE DO_QUANTITY > INVOICED_QTY
    OR (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL)
于 2013-01-14T05:12:40.413 に答える