2017-04-06 39 views
0

T-SQLの共通テーブル式で開始日と終了日のパラメータを使用しようとしています。私は非常にSQL Serverの開発に新しいですし、私はクエリで紛失しているのか分からない。SQL Server CTEの日付パラメータを使用

@startdate & @enddateの値を指定して正しい結果を得ることができます。

しかし、ユーザーが開始日と終了日の値を指定できるように、2つのパラメータを開く方法を理解しようとしています。クエリはSSRSレポートで使用されます。

DECLARE @startdate Datetime, 
     @enddate Datetime; 

SET @startdate = '2017-02-09'; 
SET @enddate = '2017-02-10'; 

WITH ManHours AS 
( 
    SELECT DISTINCT 
     a.plant_name AS Plant, SUM(tc.total_hr) AS TotalHours 
    FROM 
     area AS a 
    INNER JOIN 
     tf_department AS dep ON a.plant_id = dep.plant_id 
    INNER JOIN 
     tf_timecard AS tc ON dep.department_id = tc.department_id 
    WHERE 
     tc.timecard_dt BETWEEN @startdate AND @enddate 
     AND tc.department_id IN (266, 453, ...endlessly long list of IDs......) 
     AND tc.hourtype_id = 1 
    GROUP BY 
     a.plant_name), 
Tonnage AS 
( 
    SELECT DISTINCT 
     a.plant_name AS Plant, SUM(tglt.postqty) AS TotalTonnage 
    FROM 
     area AS a 
    INNER JOIN 
     plantgl AS pgl ON a.plant_id = pgl.plant_id 
    INNER JOIN 
     tgltransaction AS tglt ON pgl.glacckey = tglt.glacctkey 
    WHERE 
     tglt.postdate BETWEEN @startdate AND @enddate 
    GROUP BY 
     a.plant_name 
) 
SELECT DISTINCT 
    ManHours.Plant, 
    SUM(TotalTonnage) as 'Production Tons' , 
    SUM(TotalHours) as 'Man Hours', 
    TotalTonnage/TotalHours AS TonsPerManHour 
FROM 
    ManHours 
LEFT OUTER JOIN 
    Tonnage ON ManHours.Plant = tonnage.Plant 
GROUP BY 
    ManHours.Plant, ManHours.TotalHours, Tonnage.TotalTonnage 
+2

このクエリはストアドプロシージャでラップしてください – TheGameiswar

+0

DECLAREおよびSETステートメントを削除することができます。残りのクエリをSSRSのデータセットに入れると、2つのパラメータが自動的に作成されます。パラメータをDATE型に変更するだけで、クエリを実行する前に日付を入力するように求められます。 –

答えて

0

以下は、使用できるストアドプロシージャの例です。さらに、私はCTEで指定された「無限に長いIDのリスト」に2つの選択肢を提供しました。私の意見では、このロジックをクエリから抜き出し、ストアドプロシージャの先頭に配置することが最適です。これにより、が変更された場合、あなたや他の人が簡単に戻ってこのリストを変更できるようになります。さらに、テーブル変数(@ListOfDeptIdsFromTable)を用意しました。これは、実際にを使用して、文字列をハードコードするのではなく、を取得することができます。

CREATE PROCEDURE Report 
    @startdate DATETIME, 
    @enddate DATETIME 
AS 
BEGIN 

    SET NOCOUNT ON; 

    DECLARE @ListOfDeptIds VARCHAR(MAX) = '266, 453, ...endlessly long list of IDs......'; 

    DECLARE @ListOfDeptIdsFromTable TABLE 
    (
     department_id INT 
    ) 

    INSERT INTO @ListOfDeptIdsFromTable (department_id) 
    SELECT department_id 
    FROM -- Table here 
    WHERE -- Where credentials to retrieve the long list 

    WITH ManHours AS 
    ( 
     SELECT DISTINCT 
      a.plant_name AS Plant, SUM(tc.total_hr) AS TotalHours 
     FROM 
      area AS a 
     INNER JOIN 
      tf_department AS dep ON a.plant_id = dep.plant_id 
     INNER JOIN 
      tf_timecard AS tc ON dep.department_id = tc.department_id 
     WHERE 
      tc.timecard_dt BETWEEN @startdate AND @enddate 
      AND tc.department_id IN (@ListOfDeptIds) -- or ... IN (SELECT department_id FROM @ListOfDeptIdsFromTable) 
      AND tc.hourtype_id = 1 
     GROUP BY 
      a.plant_name), 
    Tonnage AS 
    ( 
     SELECT DISTINCT 
      a.plant_name AS Plant, SUM(tglt.postqty) AS TotalTonnage 
     FROM 
      area AS a 
     INNER JOIN 
      plantgl AS pgl ON a.plant_id = pgl.plant_id 
     INNER JOIN 
      tgltransaction AS tglt ON pgl.glacckey = tglt.glacctkey 
     WHERE 
      tglt.postdate BETWEEN @startdate AND @enddate 
     GROUP BY 
      a.plant_name 
    ) 
    SELECT DISTINCT 
     ManHours.Plant, 
     SUM(TotalTonnage) as 'Production Tons' , 
     SUM(TotalHours) as 'Man Hours', 
     TotalTonnage/TotalHours AS TonsPerManHour 
    FROM 
     ManHours 
    LEFT OUTER JOIN 
     Tonnage ON ManHours.Plant = tonnage.Plant 
    GROUP BY 
     ManHours.Plant, ManHours.TotalHours, Tonnage.TotalTonnage 

END 
GO