2

次のようにテーブルを定義して入力しました。

DECLARE @Temp TABLE
(
    ProjectId INT,
    EmployeeId INT,
    SomeTypeId INT,
    IsExpired BIT,
    IsWarning BIT,
    IsIncomplete BIT
)

--all incomplete...
INSERT INTO @Temp VALUES (1, 1, 1, 0, 0, 1)
INSERT INTO @Temp VALUES (1, 1, 2, 0, 0, 1)
INSERT INTO @Temp VALUES (1, 1, 3, 0, 0, 1)

--two warnings...
INSERT INTO @Temp VALUES (1, 2, 1, 0, 1, 0)
INSERT INTO @Temp VALUES (1, 2, 2, 0, 1, 0)
INSERT INTO @Temp VALUES (1, 2, 3, 0, 0, 0)

--two expirations...
INSERT INTO @Temp VALUES (1, 3, 1, 0, 0, 0)
INSERT INTO @Temp VALUES (1, 3, 2, 1, 0, 0)
INSERT INTO @Temp VALUES (1, 3, 3, 1, 0, 0)

個別の ProjectId と EmployeeId のペアを警告または有効期限とともに返したい:

SELECT DISTINCT ProjectId, EmployeeId FROM @Temp WHERE IsWarning = 1 OR IsExpired = 1

問題ない。

ただし、IsWarning = 0、IsExpired = 0、IsIncomplete = 1 の ProjectId と EmployeeId のペアも返したいのですが、これはすべての SomeTypeId (1、2、3) に当てはまる必要があります。つまり、警告も有効期限もありません。すべてのカテゴリが不完全です。

SomeTypeId はルックアップ テーブルに Fks します。現在は3名のみですが、今後増える可能性があります。

何か案は?

ProjectId, EmployeeId (1, 1) が返されると思います。

4

3 に答える 3

2

これはMAXandMINを使用して、すべての値が同じであることを確認します。+ 0通常の数値集計関数 ( MIN/ MAX/ SUM/... など)で使用できるようにするには、各ビットにa を追加する必要があります。

SELECT ProjectId, EmployeeId
FROM Temp
GROUP BY ProjectId, EmployeeId
HAVING MAX(IsWarning    + 0) = 0
   AND MAX(IsExpired    + 0) = 0
   AND MIN(IsIncomplete + 0) = 1

テスト用の SQLfiddle

于 2013-02-15T18:06:36.967 に答える
0

重複するレコードがないと仮定して、これを試してください。

まだデータを選択する必要があると仮定しunionて、が追加されていることに注意してください。不要な場合は、単に削除してください。WHERE IsWarning = 1 OR IsExpired = 1

SQL-デモはこちら

;with cte as (
  select projectid, employeeid,
         case when sometypeid in (1,2,3) and 
                   IsWarning = 0 and IsExpired = 0 and IsIncomplete = 1
              then 1 else 0 end x
  from temp  
)
select projectid, employeeid 
from cte
group by projectId, employeeid
having sum(x) >= 3
union
select projectid, employeeid 
from Temp 
where IsWarning = 1 or IsExpired = 1
于 2013-02-15T18:30:52.907 に答える
0

あなたの質問から、それらの結果が同じクエリで必要なのか、それともまったく新しいクエリが必要なのかわかりません。後者を想定すると、クエリは次のようになります。

SELECT DISTINCT ProjectId, EmployeeId FROM @Temp WHERE (IsWarning = 0 AND IsExpired = 0 AND IsIncomplete = 1)

前者を仮定すると、次のようになります。

SELECT DISTINCT ProjectId, EmployeeId FROM @Temp WHERE (IsWarning = 1 OR IsExpired = 1)

または (IsWarning = 0 AND IsExpired = 0 AND IsIncomplete = 1)

于 2013-02-15T18:06:35.600 に答える