0

これら 2 つのクエリを 1 つに結合することは可能ですか? 現在、実行している 2 つの個別のクエリがあり、次のように表示されます。

  1. ユーザー名と開いた問題の数
  2. ユーザー名とクローズした問題の数

未解決の問題:

SELECT FirstName +' ' + LastName AS 'UserName', COUNT(u.UserID) AS IssuesOpened
FROM Users u
LEFT OUTER JOIN Issues i ON i.CreatedByUserID = u.UserID
WHERE i.DateCreated BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01'
GROUP BY LastName, FirstName

結果は次のようになります。

UserName | IssuesOpened
-----------------------
User 1      10
User 2      8
User 3      55

解決済みの問題:

SELECT FirstName +' ' + LastName AS 'UserName', COUNT(u.UserID) AS IssuesClosed
FROM Users u
LEFT OUTER JOIN Issues i ON i.ResolvedByUserID = u.UserID
WHERE ResolvedDate BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01'
GROUP BY LastName, FirstName

結果は次のようになります。

UserName | IssuesClosed
-----------------------
User 1      8
User 2      2
User 3      40

これを取得するには、これら 2 つのクエリを結合したいと思います。

UserName | IssuesOpened | IssuesClosed
--------------------------------------
User 1      10              8
User 2      8               2
User 3      55              40

私はこのように醜いことを試しました:

SELECT FirstName + ' ' + LastName AS UserName,
    (SELECT COUNT(u.UserID)
    FROM Users u
    LEFT OUTER JOIN Issues i ON i.ResolvedByUserID = u.UserID
    WHERE ResolvedDate BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01')
    AS IssuesClosed,
    (SELECT COUNT(u.UserID)
        FROM Users u
        LEFT OUTER JOIN Issues i ON i.CreatedByUserID = u.UserID
        WHERE i.DateCreated BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01')
    AS IssuesOpened
FROM Users u
GROUP BY FirstName, LastName

ただし、各サブクエリで句を削除したためGROUP BY、行の合計量が返されるだけです。

アップデート

データを SqlFiddle にロードできないため (クエリ ウィンドウとスキーマ ウィンドウの両方で 8000 文字しか保持できません)、結果と sgeddes の結果のスクリーンショットをいくつか思いつきました。

私の結果 PhotoBucket 大きな画像へのリンク: 私の結果

sgeddes 結果 SGEDDESの結果

1 つ気になるのは、sgeddes の結果の最後の行で、ユーザー "Web***" の "Closed" が 449 になっていることです。これは不可能です。そのユーザー (Web***) は、顧客が Web サイトを通じて問題を開く方法を決定する方法のプレースホルダーであるためです。この偽のユーザーは、当社のシステムにアクセスできず、チケットを閉じることもできません。

4

2 に答える 2

0

これは以下を使用COUNTして動作するはずCASEです:

SELECT FirstName +' ' + LastName AS 'UserName', 
    COUNT(CASE WHEN i.DateCreated BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01' 
               THEN 1 END) AS IssuesOpened, 
    COUNT(CASE WHEN ResolvedDate BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01' 
               THEN 1 END) AS IssuesClosed
FROM Users u
    LEFT OUTER JOIN Issues i ON i.CreatedByUserID = u.UserID OR i.ResolvedByUserID = u.UserID
GROUP BY LastName, FirstName

WHEREこれにより、すべてのユーザーが返されます。そのため、一部のユーザーはカウントが 0 になる場合があります。すべてが必要ない場合は、OR上記のGROUP BY. これを行うと、 が必要な理由が否定されるOUTER JOINので、代わりに に変更しINNER JOINます。

SELECT FirstName +' ' + LastName AS 'UserName', 
    COUNT(CASE WHEN i.DateCreated BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01' 
           THEN 1 END) AS IssuesOpened, 
    COUNT(CASE WHEN ResolvedDate BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01' 
           THEN 1 END) AS IssuesClosed
FROM Users u
    INNER JOIN Issues i ON 
         i.CreatedByUserID = u.UserID OR i.ResolvedByUserID = u.UserID
WHERE i.DateCreated BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01'
    OR ResolvedDate BETWEEN '06/30/2012 23:59:59' AND '07/01/2013 00:00:01'
GROUP BY LastName, FirstName

ところで - 日付フィールドを扱うときは、代わりに >= と < を使用することをお勧めしBETWEENます。

于 2013-06-05T18:15:52.320 に答える
0

私はこのようにそれについて行きます:

  1. 指定された期間のすべてのIssueデータのピボットを解除して、すべての行にユーザー ID とユーザーが引き起こしたステータス変更のみが含まれるようにします ('Opened'または'Closed')。

  2. すべてのユーザー ID のステータス変更をカウントする結果セットをピボットします。

  3. ピボットされたセットに参加してUsers、名前にアクセスします。

これは、上記の実装の過程で私が思いついたものです:

WITH unpivoted AS (
  SELECT
    x.UserID,
    x.IssueStatusChange
  FROM Issues
  CROSS APPLY (
    VALUES
      (CreatedByUserID,  'Opened', DateCreated),
      (ResolvedByUserID, 'Closed', ResolvedDate)
  ) x (UserID, IssueStatusChange, ChangeDate)
  WHERE x.ChangeDate BETWEEN '06/30/2012 23:59:59'
                         AND '07/01/2013 00:00:01'
),
pivoted AS (
  SELECT
    UserID,
    Opened,
    Closed
  FROM unpivoted
  PIVOT (COUNT(IssueStatusChange)
  FOR IssueStatusChange IN (Opened, Closed)) p
),
SELECT
  UserName = u.FirstName + ' ' + u.LastName,
  p.Opened,
  p.Closed
FROM Users u
INNER JOIN pivoted p ON u.UserID = p.UserID
;

誰かが興味を持っている場合は、このクエリのSQL Fiddle デモもありますが、テスト データセットはそれほど注目に値するものではありません (ただし、実際に動作することを確認することはおそらく問題ありません)。

于 2013-06-05T21:26:03.207 に答える