0

このクエリでは、従業員名簿テーブルからさまざまな統計の合計を取得しています。

SELECT A.rempid AS EmpId, 
       E.flname, 
       A.rdo_total, 
       B.grave_total, 
       C.sundays, 
       D.holidays 
FROM   (SELECT rempid, 
               Count(rshiftid)AS RDO_Total 
        FROM   rtmp1 
        WHERE  rshiftid = 2 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0) A, 
       (SELECT rempid, 
               Count(rshiftid)AS Grave_Total 
        FROM   rtmp1 
        WHERE  rshiftid = 6 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0)B, 
       (SELECT rempid, 
               Count(rshiftid) AS Sundays 
        FROM   rtmp1 
        WHERE  Datepart(dw, rdate) = 1 
               AND rshiftid > 2 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0)C, 
       (SELECT rempid, 
               Count(rshiftid) AS Holidays 
        FROM   rtmp1 
        WHERE  rdate IN (SELECT pubhdt 
                         FROM   pubhol) 
               AND rshiftid > 2 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0)D, 
       (SELECT empid, 
               [fname] + ' ' + [sname] AS flName 
        FROM   remp1)E 
WHERE  A.rempid = B.rempid 
       AND A.rempid = E.empid 
       AND A.rempid = C.rempid 
       AND A.rempid = D.rempid 
ORDER  BY A.rempid 

2日以内にデータベースにクエリを実行できるように、日付範囲を追加したいと思います。rTmp1テーブルには、rDateという列があります。私はこれを行うための最良の方法は何だろうと思っていました。これをストアドプロシージャに追加し、各選択クエリに変数を追加できます。または、日付範囲内でクエリを実行するためのより良い方法はありますか。

4

2 に答える 2

1

次のようなwhere句の項目を追加するだけだと思います。

AND ( rDate > somedate AND rDate < someotherdate )
于 2013-01-07T21:28:36.020 に答える
0

各クエリに日付範囲を追加するのが最も直接的な解決策です。

これをストアドプロシージャにすることは、クエリで常に実行できることですが、この特定のケースとは関係ありません。

テーブルを指定された日付範囲に絞り込んだ結果のレコード数がテーブル全体よりも大幅に少ない場合は、これらのレコードを一時テーブルまたはテーブル変数に挿入し、そのテーブルに対して既存のクエリを実行するオプションがあります。結果セット。

テストするデータはありませんが、読みやすく、パフォーマンスが向上する可能性があるため、次のクエリを検討してください。ただし、結果を自分で確認し、調整を行う必要があります。

DECLARE @startDate date = '12/01/2012'
DECLARE @endDate date = DATEADD(MONTH, 1, @startDate)

SELECT
  [e].[empid],
  [e].[fname] + ' ' + [e].[sname] AS [flName],
  SUM(CASE WHEN [t].[rshiftid] = 2 THEN 1 ELSE 0 END) AS [RDO_Total],
  SUM(CASE WHEN [t].[rshiftid] = 6 THEN 1 ELSE 0 END) AS [Grave_Total],
  SUM(CASE WHEN [t].[rshiftid] > 2 AND DATEPART(dw, [t].[rdate]) = 1 THEN 1 ELSE 0 END) AS [Sundays],
  SUM(CASE WHEN [t].[rshiftid] > 2 AND [h].[pubhdt] IS NOT NULL THEN 1 ELSE 0 END) AS [Holidays]
FROM [remp1] [e]
INNER JOIN [rtmp1] [t] ON [e].[empid] = [t].[rempid]
LEFT JOIN [pubhol] [h] ON [t].[rdate] = [h].[pubhdt]
WHERE [t].[rdate] BETWEEN @startDate AND @endDate
GROUP BY 
  [e].[empid],
  [e].[fname],
  [e].[sname]
ORDER BY [empid] ASC
于 2013-01-07T21:31:52.313 に答える