2010-12-30 1 views
0

EDIT:最後にサンプルI/O。グループ化されたサブセットに存在するかどうかを示すSELECTを使用して存在をテストする

私は、特定の条件が存在する場合、または別の条件が存在しない場合、+1を数える必要があるデータを持っています。私は一時テーブルに次の単純化されたサンプルXMLを細断し、それを検証するSQL Server 2008の

を使用しています:

<product type="1"> 
    <param type="1"> 
     <item mode="0" weight="1" /> 
    </param> 
    <param type="2"> 
     <item mode="1" weight="1" /> 
     <item mode="0" weight="0.1" /> 
    </param> 
    <param type="3"> 
     <item mode="1" weight="0.75" /> 
     <item mode="1" weight="0.25" /> 
    </param> 
    </product> 

懸念における検証は、次のルールです:

のためにそれぞれの製品タイプは、各パラメータタイプについて、 モードは0 &(1 || 2)となります。 の場合、0(s)がある可能性がありますが、 は1秒または2秒が必要です。または は1または2だけです。 は0のみで、1は と2とすることはできません。

私が分かっていない部分は、0しかないかどうかを検出する方法です。これは「問題がない」問題のようです。

(この部分の)検証コード:

WITH t1 AS (
    SELECT  SUM(t.ParamWeight) AS S, COUNT(1) AS C, 
       t.ProductTypeID, t.ParamTypeID, t.Mode 
    FROM  @t AS t 
    GROUP BY t.ProductTypeID, t.ParamTypeID, t.Mode 
), 
    ... 
    UNION ALL   
    SELECT  TOP (1) 1 -- only mode 0 & (1 || 2) is allowed 
    FROM  t1 
    WHERE  t1.Mode IN (1, 2) 
    GROUP BY t1.ProductTypeID, t1.ParamTypeID 
    HAVING  COUNT(1) > 1 
    UNION ALL 
    ... 
) 
SELECT  @C = COUNT(1) 
FROM  t2 

グループは、私はシンプルがあると確信している唯一の0が含まれている場合、この& 2S 1S任意のモードが混在している場合は表示されますが、しません解決策ですが、今は私を回避しています。

EDIT:

私は完璧に動作し、 "チート" と思いました。私は上記に以下を追加しました:

SELECT  TOP (1) 1 -- only mode 0 & (null || 1 || 2) is allowed 
FROM  t1 
GROUP BY  t1.ProductTypeID, t1.ParamTypeID 
HAVING  SUM(t1.Mode) = 0 

しかし、私はまだ不正行為をせずにこれを行う方法を知りたいと思います。私はあなたがちょうどあなたのクエリに答えるために、これらの3つの列を使用することができると思う

SELECT ProductTypeID,ParamTypeID,MIN(Mode) as Has0,MAX(Mode) as M1or2,MAX(CASE WHEN Mode=1 THEN 1 ELSE 0 END) as M1 
from @t 
group by ProductTypeID,ParamTypeID 

SAMPLEは

Zero One Two Result 
1  0 0 False 
0  1 1 False 
1  1 1 False 
0  1 0 True 
0  0 1 True 
1  1 0 True 
1  0 1 True 

答えて

2

さて、あなたは、次のクエリを書くことができます。 Has0 = 0の場合、モード0の値があるので、M1or2は0より大きくなる必要があります(私が正しく理解している場合)。

M1or2 = 2の場合、M1を0(モード2の行が見つかった場合はモード1の行が見つかりません)にしたいことも確認できます。

あなたの説明を正しく読んだと思います。そうでない場合は、「許可」と「禁止」の組み合わせのサンプルを追加すると役立ちます。


SELECT ProductTypeID,ParamTypeID,CASE 
    WHEN M1OrM2 = 2 And M1 = 1 THEN 0 /* Have both mode 2 and mode 1. Can ignore whether it has any Mode 0 */ 
    WHEN Has0 = 0 AND M1OrM2 = 0 THEN 0 /* Has a mode 0 and no M1 or M2 */ 
    ELSE 1 END /* All other combinations are allowed */ 
FROM (
SELECT ProductTypeID,ParamTypeID,MIN(Mode) as Has0,MAX(Mode) as M1or2,MAX(CASE WHEN Mode=1 THEN 1 ELSE 0 END) as M1 
from @t 
group by ProductTypeID,ParamTypeID 
) t 
+0

おかげダミアン。あなたのSQLを正しく読んでいるのであれば、minモードが1の場合、Has0は1になる可能性があります。はい...私はそれをテストしました。私はあなたが示唆したようにいくつかのサンプルを投稿します。 – IamIC

+1

@IanC - サンプルの「False」行に対して0を返し、それ以外の場合は1を返す新しいクエリを追加しました。それで十分ですか? –

+0

素晴らしい!本当にありがとう!! – IamIC

関連する問題