4

SQL ステートメントから必要な結果を取得する際に問題が発生しています。おそらく単純なものが欠けていることはわかっていますが、それを見ることができません。

これが私のテーブルです。

表: ユーザー (RoleID は Roles テーブルの ID にリンクされています) 
IDFirstNameLastNameRoleID 
1、マット、ライアン、1
2、チッパー、ジョーンズ、1
3、フリオ、ジョーンズ、2
4、ジェイソン、ボーン、3

表: 役割
ID名前
1、現場担当者
2、技術
3、管理者

表: FRrequests  (UserID は Users テーブルの ID にリンクされています)  
IDUserIDStatus
1、1、開く
2、1、提出済み
3、1、遅延
4、1、完了

私が欲しいのは、すべてのフィールド担当者のすべての「送信済み」および「遅延」リクエストの数を表示する SQL ステートメントです。以下は、望ましい結果の例です。

ネーム             カウント
チッパー・ジョーンズ 0
マット・ライアン 2

これが私がこれまでに持っている声明とそれが私に与える結果です。

SELECT Users.FirstName + ' ' + Users.LastName AS Name, COUNT(FRrequests.ID) AS 'Open Requests'
FROM ユーザーの内部結合
          ロール ON Users.RoleID = Roles.ID LEFT OUTER JOIN
          FRrequests ON Users.ID = FRrequests.UserID
WHERE (Roles.Name = N'Field Rep') AND (FRrequests.Status = 'Submitted' OR FRrequests.Status = 'Delayed')
GROUP BY Users.FirstName、Users.LastName

ネーム             カウント
マット・ライアン 2

「AND (FRrequests.Status = 'Submitted' OR FRrequests.Status = 'Delayed')」の部分が壊れていることを知っています。ステートメントでそれなしで実行すると、すべてのユーザーが取得されますが、送信および遅延だけでなく、すべてのステータスがカウントされます。これを機能させるために何が欠けているのかわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

1

あなたは本当に近いです、次のことを試してください:

SELECT U.FirstName + ' ' + U.LastName AS Name, COUNT(F.ID) AS 'Open Requests'
FROM Users U
INNER JOIN Roles R
    ON U.RoleID = R.ID 
LEFT JOIN ( SELECT * FROM FRrequests 
            WHERE Status IN ('Submitted','Delayed')) F
    ON U.ID = F.UserID
WHERE R.Name = N'Field Rep' 
GROUP BY U.FirstName, U.LastName
于 2012-11-07T21:18:22.643 に答える
0

リクエストのないフィールド担当者を含める場合は、フィールド担当者ごとに行が必要です。したがって、次の行に沿って左外部結合を使用する必要があります。

SELECT 
    u.FirstName || ' ' || u.LastName as Name 
    , COALESCE(frr.Counter,0) as Count 
FROM 
    Users u 
    LEFT OUTER JOIN ( 
        SELECT 
            UserID 
            ,count(*) as Counter 
        FROM 
            FRrequests 
        WHERE 
            Status IN ('Submitted', 'Delayed') 
        GROUP BY
            UserID
    ) frr ON frr.UserID = u.ID 
    , Roles r 
WHERE 
    u.ID = f.UserID 
    AND u.RoleID = r.ID 
    AND r.Name = 'Field Rep' 
;

左外部結合は、一致が発生した場合にのみ結合を提供するため、自然に結合されたセットから行を削除しません。この場合、フィールド担当者であるすべてのユーザーのリストと、「送信済み」または「遅延」ステータスの FRrequests の数 (存在する場合) が取得されます。

COALESCE は (少なくとも Postgresql では) null 値をチェックし、それを指定された値 (この場合は 0) に強制するために使用されます。左外部結合) 0 に置き換えられます。

于 2012-11-07T21:29:10.300 に答える