0

maxまたはminのブール式をnullif()statemtentに入れることは可能ですか?

例えば

select 
    min(a) as b ---grabbing first value
    ,max(a) as  c --- grabbing last value but could be same as min value, this is the problem
    ,nullif(min(a), (min(a) = max(a))) ---my idea for a solution that didnt work
   from table

フィールドの値が1回だけ発生する場合に、重複する行を削除しようとします。カウントしてから1を超える値を持つすべての値を取り除くことでこれを行う方法があるかもしれないと思っていますが、それを達成する方法がわかりません。sql server 2005で作業している場合、可能であればt-sqlでこれが必要ですが、サーバーで動作するものはすべて問題ありません。

編集して詳細情報を提供する:注文管理システムで注文のステータス履歴を確認しています。このシステムでは、IDで修正が要求されるたびにタグが付けられます。IDは一意で数値です。この形式1234では、各orderidは一意であり、この形式1111111.2でも数値です。aは一意の修正IDを表します。順序を確認したいと思います。ある修正IDがすでに発生している場合は、次の修正IDを取得し、可能であれば次の修正IDを取得します。少なくとも、MAX値とMIN値が必要です。最小値を2回カウントし(私の例を使用)、正確なデータが得られないため、2つの列を実行することはできません。

私の例では単純にしようとしていましたが、十分な情報が提供されていません。詳細は次のとおりです。

SELECT Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                 + Cast(oi.orderitemid AS VARCHAR(MAX)) AS OrderNumber,
       Min(oici.orderitemcorrectionid)                  AS a,
       Max(oici.orderitemcorrectionid)                  AS b
FROM   Orderitems oi
       LEFT JOIN orderitemcorrections oic
         ON oic.orderid = oi.orderid
            AND oic.orderitemid = oi.orderitemid
       LEFT JOIN orderitemcorrectionissues oici
         ON oici.orderitemcorrectionid = oic.orderitemcorrectionid
       LEFT JOIN correctiontypes ct
         ON ct.correctiontypeid = oici.correctiontypeid
GROUP  BY Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                   + Cast(oi.orderitemid AS VARCHAR(MAX)) 

上記のクエリのサンプルテーブルデータ:

OrderNumber a   b
1098048.1   1   2
1098210.1   160 160
1098222.1   78  78
1098300.1   31  31
1098408.1   4   4
1098462.1   224 224
1098468.1   602 602
1098492.2   1457 1457

上記はaとbが同じであるデータであり、以下はそれらが異なるデータですが、aからbへの重複をnullにしたい

1100268.1   181 191
1100256.1   306 379

行の重複を表示するためにグループ化されていない、より多くのデータ。-生データのサンプル

OrderNumber orderitemcorrectionid
1098048.1   1
1098048.1   2
1098210.1   160
1098210.1   160
4

2 に答える 2

2

重複する行を削除するUNIONを使用すると、無効化を実現できます。私はこのようにします

;with tmp AS (
    select
    CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX)) as OrderNumber
    ,min(oici.orderitemcorrectionid) as a
    ,max(oici.orderitemcorrectionid) as b

    FROM
    Orderitems oi
    left join orderitemcorrections oic on oic.orderid = oi.orderid and oic.orderitemid = oi.orderitemid
    left join orderitemcorrectionissues oici on oici.orderitemcorrectionid = oic.orderitemcorrectionid
    left join correctiontypes ct on ct.correctiontypeid = oici.correctiontypeid
    GROUP BY 
    CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))
)
select OrderNumber, a
from tmp
union
select OrderNumber, b
from tmp

これにより、aとbが異なる行に配置され、Unionが重複の削除を処理します。

于 2012-09-28T20:29:45.363 に答える
0

おそらくこのようなもの:

SELECT Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                 + Cast(oi.orderitemid AS VARCHAR(MAX)) AS OrderNumber,
       COALESCE(Min(oici.orderitemcorrectionid),Max(oici.orderitemcorrectionid),0) AS a,
       COALESCE(Max(oici.orderitemcorrectionid),Min(oici.orderitemcorrectionid),0) AS b
FROM   Orderitems oi
       LEFT JOIN orderitemcorrections oic
         ON oic.orderid = oi.orderid
            AND oic.orderitemid = oi.orderitemid
       LEFT JOIN orderitemcorrectionissues oici
         ON oici.orderitemcorrectionid = oic.orderitemcorrectionid
       LEFT JOIN correctiontypes ct
         ON ct.correctiontypeid = oici.correctiontypeid
GROUP  BY Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                   + Cast(oi.orderitemid AS VARCHAR(MAX)) 

しかし、私は誤解している可能性があるので、親切にしてください。

于 2012-09-28T20:31:55.827 に答える