1

各従業員がその週に働いていることを要約するクエリを取得しようとしています。たとえば、John Doeはその週に合計12枚のチケットを作成し、そのうち4枚はBreak / Fixes、4枚はEnhancement、もう4枚は未分類でした。

これは私がこれまでに持っているものです:

SELECT (users.first_name || ' ' || users.last_name) AS Name,
  COUNT(tickets.id) AS 'Number of Tickets Closed',
  COUNT(tickets.category = 'Maintenance') AS 'Maintenance Tickets',
  COUNT(tickets.category = 'After Hours') AS 'After Hours Tickets',
  COUNT(tickets.category = 'Break Fix') AS 'Break Fix Tickets',
  COUNT(tickets.category = 'Enhancement') AS 'Enhancement Tickets',
  COUNT(tickets.category = '') AS 'Non Categorized Tickets'
FROM tickets, users
ON tickets.assigned_to=users.id
WHERE (tickets.status = 'closed') AND
  (tickets.closed_at >= '2011-07-16 00:00:00') AND
  (tickets.closed_at <= '2011-07-22 23:59:59')
GROUP BY Name;

結果の例を次に示します。

John Doe1 10 10 10 10 10 10

John Doe2 2 2 2 2 2 2

John Doe3 25 24 24 24 24 24

John Doe4 2 2 2 2 2 2

John Doe5 12 10 10 10 10 10

John Doe6 7 7 7 7 7 7

すべての列の合計が同じであるため、このクエリは期待どおりに機能しません(閉じられたチケットの総数、次の列には分類されたもののみが含まれているようです)。

編集

関数型コードを投稿したかっただけです:

SELECT (users.first_name || ' ' || users.last_name) AS Name,
  COUNT(tickets.id) AS 'Number of Tickets Closed',
  COUNT(case tickets.category when 'Maintenance' then 1 else null end) AS 'Maintenance Tickets',
  COUNT(case tickets.category when 'After Hours' then 1 else null end) AS 'After Hours Tickets',
  COUNT(case tickets.category when 'Break Fix' then 1 else null end) AS 'Break Fix Tickets',
  COUNT(case tickets.category when 'Enhancement' then 1 else null end) AS 'Enhancement Tickets',
  COUNT(case tickets.category when '' then 1 else null end) AS 'Non Categorized Tickets'
FROM tickets, users
ON tickets.assigned_to=users.id
WHERE (tickets.status = 'closed') AND
  (tickets.closed_at >= '2011-07-16') AND
  (tickets.closed_at <= '2011-07-22')
GROUP BY Name;
4

2 に答える 2

5

このように COUNT を使用することもできます

...
    COUNT(case tickets.category when 'Maintenance' then 1 else null end),
    COUNT(case tickets.category when 'After Hours' then 1 else null end),
...
于 2011-07-21T14:28:54.960 に答える
1

GROUP BY 句でエイリアスを使用できないようです。ユーザーは、それらを区別するために使用できる ID を持っていませんか?

また、条件と比較してカウントする場合は、COUNT の代わりに SUM を使用する必要があります。

SELECT (users.first_name || ' ' || users.last_name) AS Name,
  COUNT(tickets.id) AS 'Number of Tickets Closed',
  SUM(tickets.category = 'Maintenance') AS 'Maintenance Tickets',
  SUM(tickets.category = 'After Hours') AS 'After Hours Tickets',
  SUM(tickets.category = 'Break Fix') AS 'Break Fix Tickets',
  SUM(tickets.category = 'Enhancement') AS 'Enhancement Tickets',
  SUM(tickets.category = '') AS 'Non Categorized Tickets'
FROM tickets, users
ON tickets.assigned_to=users.id
WHERE (tickets.status = 'closed') AND
  (tickets.closed_at >= '2011-07-16 00:00:00') AND
  (tickets.closed_at <= '2011-07-22 23:59:59')
GROUP BY Name;
于 2011-07-21T14:20:06.697 に答える