3

下のようなテーブルがあります

SALES_ORDER_ID DATEDIFFERENCE FLAG
1 -40 1
1 -20 1
2 40 0
2 -10 1
3 12 0
4 -70 1
5 60 0
5 23 0

// ddl

Declare @t table (sales_order_id int,DateDifference int, Flag int)
Insert Into @t 
                Select 1,-40,1 Union All Select 1,-20,1 Union All
                Select 2,40,0 Union All Select 2,-10,1 Union All
                Select 3,12,0 Union All Select 4,-70,1 Union All
                Select 5,60,0 Union All Select 5,23,0
Select *
From @t 

出力は次のようになります

sales_order_id  DateDifference  Flag
3                      12          0
5                      60          0
5                      23          0

つまり、すべてのアイテムのフラグが0であるグループ(Sales_Order_Id)です。

つまり、少なくとも1つのアイテムがゼロではないため、Sales_Order_Id = 2は表示されません(2、-10,1)

情報が足りない場合は、私に聞いてください。

このクエリを実行するにはどうすればよいですか?

編集

私は自分の答えを見つけました..それでももっとエレガントなものを探しています

 ;with cte as(
    Select 
        sales_order_id = Case when x.sales_order_id is null then y.sales_order_id else x.sales_order_id end 
        ,x.CountFor0
        ,y.CountFor1
    From 
            (Select sales_order_id,CountFor0 = count(*)
            from @t 
            where Flag = 0
            group by sales_order_id )x
    Full Join 

            (Select sales_order_id,CountFor1 =count(*)
            from @t 
            where Flag = 1
            group by sales_order_id )y
    On x.sales_order_id = y.sales_order_id)

    Select *
    From cte
    where CountFor1 is null

ありがとうございます

評判が悪いので、回答欄に回答を投稿できません

4

6 に答える 6

1

良い一日!

私はそれが役立つと思います:

Select * from @t WHERE FLAG=0;
于 2012-07-27T03:29:34.343 に答える
1

さて、あなたがやろうとしていることを理解しました。NOT EXISTS他の人が提案しているように、を使用できます( sqlfiddle):

SELECT *
FROM @t T1
WHERE Flag = 0
AND NOT EXISTS (
    SELECT * 
    FROM @t T2 
    WHERE T1.sales_order_id = T2.sales_order_id
    AND T2.Flag <> 0)

NOT IN他の人も提案しているように、を使用することもできます( sqlfiddle):

SELECT *
FROM @t T1
WHERE Flag = 0
AND sales_order_id NOT IN (
    SELECT sales_order_id 
    FROM @t T2 
    WHERE T2.Flag <> 0)

また、を使用してJOIN、結合されたテーブルに行がないことを確認することもできます(idはNULLです)(sqlfiddle):

SELECT *
FROM @t T1
LEFT OUTER JOIN @t T2 ON T1.sales_order_id = T2.sales_order_id AND T2.Flag <> 0
WHERE T1.Flag = 0
AND T2.sales_order_id IS NULL

元の答え:

結果をフィルタリングするWHEREが必要です。

SELECT * 
FROM @t
WHERE Flag = 0

ここでsqlfiddleをチェックしてください

(2,40,0)ただし、結果の行も必要だと思います。

于 2012-07-27T03:33:34.370 に答える
1

これを試して..

SELECT sales_order_id,DateDifference,Flag FROM @t WHERE sales_order_id NOT IN 
 (SELECT sales_order_id FROM @t WHERE Flag=1)
于 2012-07-27T07:24:22.483 に答える
1

これはWindows関数を使用するのに最適な場所であることを付け加えたいと思います。

select sales_order_id, DateDifference, flag
from (select t.*, SUM(flag) over (partition by sales_order_id) as sumflag
      from @t t
     ) t
where sumflag = 0
于 2012-07-27T15:47:18.867 に答える
0
select *
from @T as T1
where not exists(select *
                 from @T as T2
                 where T1.sales_order_id = T2.sales_order_id and
                       T2.Flag = 1)
于 2012-07-27T05:22:37.023 に答える
0

これを試して:

Select * From @t 
where Flag=0 and sales_order_id not in 
(select sales_order_id from @t  where Flag !=0)
于 2012-07-27T06:50:28.730 に答える