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
おかげダミアン。あなたのSQLを正しく読んでいるのであれば、minモードが1の場合、Has0は1になる可能性があります。はい...私はそれをテストしました。私はあなたが示唆したようにいくつかのサンプルを投稿します。 – IamIC
@IanC - サンプルの「False」行に対して0を返し、それ以外の場合は1を返す新しいクエリを追加しました。それで十分ですか? –
素晴らしい!本当にありがとう!! – IamIC