0

CASEに関する何十もの回答を読んだことがありますが、それがここで使用する必要があるものかどうかわかりません.動作するはずですが、そうではありません:

Data:
OrderNum    OrderLine  PartNum
200011         1         ABC-1
200011         2         DEF-1
200012         1         XYZ-1

What I would like to return:
OrderNum   Item#
200011     MIXED
200012     XYZ-1


What I am returning instead:
OrderNum   Item#
200011     ABC-1
200011     MIXED
200012     XYZ-1

私のクエリ:

SELECT OrderHed.OrderNum, 
      (CASE WHEN ShipDtl.OrderLine > '1' then 'MIXED' else ShipDtl.PartNum end) as [Item#]
FROM dbo.OrderHed, dbo.ShipDtl
WHERE ShipDtl.Company = OrderHed.Company 
AND ShipDtl.OrderNum = OrderHed.OrderNum
GROUP BY OrderHed.OrderNum, ShipDtl.OrderLine, ShipDtl.Part
4

3 に答える 3

1

使用するデータベース エンジンを記述していませんが、SQL 2005 以降の場合は、COUNT にウィンドウ関数を使用すると、グループ化する必要がないため、作業が簡単になると思います。

SELECT  DISTINCT
        OrderHed.OrderNum ,
        CASE 
            WHEN COUNT(ShipDtl.OrderLine) OVER (PARTITION BY ShipDtl.OrderNum) > 1 THEN 'MIXED'
            ELSE PartNum
        END AS [Item#]
FROM    dbo.OrderHed ,
        dbo.ShipDtl
WHERE   ShipDtl.Company = OrderHed.Company
        AND ShipDtl.OrderNum = OrderHed.OrderNum

ただし、行ごとに行を選択するため、 DISTINCT が必要になりますが、複数の行を含む各注文は混合されるため、簡単に区別できます。

これは単純に OrderNum を選択し、ordernum Count(xxx) OVER (yyy によるパーティション) ごとに複数の orderlines が存在する場合は 'MIXED' を選択し、それ以外の場合は partnum を選択します。そして、結果を区別します。

于 2013-11-07T08:12:16.120 に答える
1

のようにグループ化してみてください

SELECT OrderHed.OrderNum, 
      (CASE WHEN SUM(ShipDtl.OrderLine) > 1 then 'MIXED' else MAX(ShipDtl.PartNum) end) as [Item#]
FROM dbo.OrderHed, dbo.ShipDtl
WHERE ShipDtl.Company = OrderHed.Company 
AND ShipDtl.OrderNum = OrderHed.OrderNum
GROUP BY OrderHed.OrderNum

SQLFiddle デモ: http://sqlfiddle.com/#!3/209d8/1

于 2013-11-07T07:24:46.787 に答える