1

私はこのサイトで12近くの同様の問題を読みましたが、私の特定のケースはどこにも取り上げられていなかったと思います。私はdbaではありません。これは、ここで誰よりもSQLを知っていたために自発的に行ったサイドプロジェクトです。したがって、誰かがこのクエリが災害であると言っても、個人的には取り上げません。:-)

これは私の質問です:

SELECT COUNT(a.issue_type_id) as DistinctIssues, b.issue_type_name, c.subissue_type_name, null AS DistinctTickets
FROM [somedb].[dbo].[wh_task] AS a
INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id
INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id
WHERE a.[create_time] between '11/01/12' AND '01/31/13'
AND a.[account_id] = 123456
AND a.[account_contact_id] is not null
GROUP BY b.issue_type_name, c.subissue_type_name  
UNION
SELECT null as DistinctIssues, b.issue_type_name, c.subissue_type_name, COUNT(a.issue_type_id) as DistinctTickets
FROM [somedb].[dbo].[wh_task] AS a
INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id
INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id
WHERE a.[create_time] between '11/01/12' AND '01/31/13'
AND a.[account_id] = 123456
GROUP BY b.issue_type_name, c.subissue_type_name  

そして、結果は次のようになります。

DistinctIssues  issue_type_name   subissue_type_name   DistinctTickets
NULL            Storage           EMC                  45
NULL            Storage           HP                   2
NULL            Symantec          Anti Virus           1
NULL            Symantec          Backup Exec          4
NULL            Virtualization    Environmental        1
NULL            Virtualization    Network              5
1               Microsoft         Server 2003          NULL
1               Microsoft         Windows 7            NULL
1               Network           Performance          NULL
1               Virtualization    Environmental        NULL
2               Exchange          Database             NULL

私が何をしようとしているのか、ここから推測できると思います。2つの発行タイプでグループ化しており、すべてのチケットの数と、それらのチケットのサブセットの数が必要です。私のデータベースはMSSQLサーバーです(2008年だと思います)。私はビューにしかアクセスできませんが、それだけの価値があります。

4

2 に答える 2

1

両方のクエリは同じ基準で同じテーブルを結合し、同じ基準で結果をグループ化し、同じ列をカウントします。唯一の違いは、クエリの1つがWHERE句で追加の条件を使用していることです。

その場合、クエリによって返される値の条件付き集計と追加の条件(DistinctIssues)を使用して、それらを1つのクエリに組み合わせることができます。

SELECT
  COUNT(CASE WHEN a.[account_contact_id] is not null THEN a.issue_type_id END) as DistinctIssues,
  b.issue_type_name,
  c.subissue_type_name,
  COUNT(a.issue_type_id) as DistinctTickets
FROM [somedb].[dbo].[wh_task] AS a
INNER JOIN [somedb].[dbo].[wh_issue_type] AS b
  ON a.issue_type_id = b.issue_type_id
INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c
  ON a.subissue_type_id = c.subissue_type_id
WHERE a.[create_time] between '11/01/12' AND '01/31/13'
  AND a.[account_id] = 123456
GROUP BY b.issue_type_name, c.subissue_type_name
;
于 2013-02-05T00:18:37.523 に答える
0

これを行うための最良の方法が少し情報が不足していることを確認するのは少し難しいです-あなたは次のようなことを意味しますか?

WITH Issues AS
(
  SELECT COUNT(a.issue_type_id) as DistinctIssues, b.issue_type_name, c.subissue_type_name
  FROM [somedb].[dbo].[wh_task] AS a
  INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id
  INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id
  WHERE a.[create_time] between '11/01/12' AND '01/31/13'
  AND a.[account_id] = 123456
  AND a.[account_contact_id] is not null
  GROUP BY b.issue_type_name, c.subissue_type_name
),
Tickets AS
(
  SELECT b.issue_type_name, c.subissue_type_name, COUNT(a.issue_type_id) as DistinctTickets
  FROM [somedb].[dbo].[wh_task] AS a
  INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id
  INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id
  WHERE a.[create_time] between '11/01/12' AND '01/31/13'
  AND a.[account_id] = 123456
  GROUP BY b.issue_type_name, c.subissue_type_name
)
SELECT i.DistinctIssues
  , COALESCE(i.issue_type_name, t.issue_type_name) AS issue_type_name
  , COALESCE(i.subissue_type_name, t.subissue_type_name) AS subissue_type_name
  , t.DistinctTickets
FROM Issues i
  FULL JOIN Tickets t ON i.issue_type_name = i.issue_type_name
    AND i.subissue_type_name = t.subissue_type_name

これにより、存在する各組み合わせの問題とチケットの両方が提供されます。

それが必要なものでない場合は、サンプルデータセットと目的の出力を提供することもできますか?

于 2013-02-04T22:44:01.490 に答える