1

正しい結果を生成した 2 つの異なるクエリがありますが、1 つのテーブルで答えを生成したいと考えています。それ、どうやったら出来るの?

これが私のコードです:

SELECT count(distinct ID) as NoOfEmployees
FROM Table_Name
WHERE date<= '2012-05-31';

select count(subA.ID) as EmployeesChanged from (
SELECT A.ID 
FROM Table_Name A 
WHERE A.date < '2012-06-01' 
GROUP BY 1 
HAVING COUNT(A.Service_type) > 1 ) subA

現在、次の出力があります。

就業者数
バツ
従業員の変更
バツ

どうやって作るの?

従業員数 | 従業員が変更されました | (従業員数 - 変更数)
× | × | バツ
4

3 に答える 3

2

どのデータベースを使用しているかわかりません。ただし、一部のデータベースでは、次を試すことができます。

select q1.Value, q2.Value, q1.Value - q2.Value from
  (SELECT count(distinct ID) as Value FROM Table_Name 
    WHERE date<= '2012-05-31') q1,
  (select count(subA.ID) as Value from 
      ( SELECT A.ID FROM Table_Name A 
        WHERE A.date < '2012-06-01' GROUP BY 1 
        HAVING COUNT(A.Service_type) > 1 ) subA) q2
于 2012-07-12T19:45:23.930 に答える
0

date<= '2012-05-31' が A.date < '2012-06-01' と同じ場合は?

SELECT COUNT(1) AS NoOfEmployees,
SUM(CASE WHEN STCount > 0 then 1 else 0 end) as HasChange,
SUM(CASE WHEN STCount = 0 then 1 else 0 end) as NoChange
FROM 
  (SELECT ID,
  COUNT(A.Service_type) STCount
  FROM Table_Name
  WHERE date<= '2012-05-31'
  GROUP BY ID) AS Data
于 2012-07-12T19:53:04.680 に答える
0

使用できますCROSS JOIN

SELECT a.*, b.*, a.NoOfEmployees - b.EmployeesChanged
FROM
(
    SELECT count(distinct ID) as NoOfEmployees
    FROM Table_Name
    WHERE date<= '2012-05-31'
) a
CROSS JOIN
(
    SELECT count(subA.ID) as EmployeesChanged 
    FROM 
    (
        SELECT A.ID 
        FROM Table_Name A 
        WHERE A.date < '2012-06-01' 
        GROUP BY 1 
        HAVING COUNT(A.Service_type) > 1 
    ) subA
) b

編集:

2 つの個別のクエリを実行する代わりに、条件付き集計を使用することで、クエリを大幅に最適化できる場合があります。

SELECT a.NoOfEmployees, a.EmployeesChanged, a.NoOfEmployees - a.EmployeesChanged
FROM
(
    SELECT 
        COUNT(DISTINCT CASE WHEN date <= '2012-05-31' THEN ID END) as NoOfEmployees,
        COUNT(DISTINCT CASE WHEN date < '2012-06-01' AND COUNT(Service_type) > 1 THEN ID END) AS EmployeesChanged
    FROM Table_Name
    GROUP BY ID
) a
于 2012-07-12T19:48:14.560 に答える