2016-06-29 6 views
0

SQLサーバーのマルチステートメントテーブル値関数の頭を悩ましていますが、以下のクエリを関数内で使用したいのですが、実行する方法や実行できるかどうか不明です、任意の方向が大幅にここ行を返すSQL関数

DECLARE @start_time DATETIME ='2016-6-27 07:00:00'; 
    DECLARE @end_time DATETIME ='2016-6-27 15:00:00'; 
    DECLARE @address INT = 53; 
    BEGIN 

     SELECT (t1-totalhopper_01)* 0.002204622621 AS HPR1,(t2-totalhopper_02)* 0.002204622621 AS HPR2,(t3-totalhopper_03)*0.002204622621 AS HPR3,(t4-totalhopper_04)*0.002204622621 AS HPR4,(t5-totalhopper_05)*0.002204622621 AS HPR5,(t6-totalhopper_06)* 0.002204622621 AS HPR6 
      FROM(
        SELECT TOP 1 ROW_NUMBER() OVER(ORDER BY totalhopper_01 ASC) AS rownuma,TotalHopper_01,TotalHopper_02,TotalHopper_03,TotalHopper_04,TotalHopper_05,TotalHopper_06 FROM mm_Cycle_Data 
        WHERE TotalHopper_01 IS NOT NULL 
         AND TotalHopper_02 IS NOT NULL 
         AND TotalHopper_03 IS NOT NULL 
         AND TotalHopper_05 IS NOT NULL 
         AND TotalHopper_06 IS NOT NULL 
         AND t_stamp= (SELECT MIN(t_stamp) FROM mm_Cycle_Data WHERE get_address = @address AND T_stamp BETWEEN @start_time AND @end_time) 
       )a 

      LEFT JOIN(

         SELECT TOP 1 ROW_NUMBER() OVER(ORDER BY totalhopper_01 ASC) AS rownum,TotalHopper_01 AS T1,TotalHopper_02 AS t2,TotalHopper_03 AS t3 ,TotalHopper_04 AS t4,TotalHopper_05 AS t5,TotalHopper_06 AS t6 FROM mm_Cycle_Data 
         WHERE TotalHopper_01 IS NOT NULL 
          AND TotalHopper_02 IS NOT NULL 
          AND TotalHopper_03 IS NOT NULL 
          AND TotalHopper_05 IS NOT NULL 
          AND TotalHopper_06 IS NOT NULL 
          AND t_stamp= (SELECT MAX(t_stamp) FROM mm_Cycle_Data WHERE get_address = @address AND T_stamp BETWEEN @start_time AND @end_time) 
        )ac 
      ON rownuma=rownum; 

クエリ結果


HPR1         HPR2         HPR3         HPR4         HPR5         HPR6 
--------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- 
5800.602419716689      0.000000000000       133.772091397038      0.000000000000       0.000000000000       0.000000000000 
+1

あなたはどんな問題を抱えていますか? –

+0

私は関数をどのように作成するのか、どのような関数があるのか​​分かりません。ここで方向性を探している。 – Jad

+0

テーブル値関数が適切であるように見える – Jonny

答えて

1

を高く評価しているあなたのコードを使用して追従するための基本的なレイアウトです。どのように使用するべきかを理解するために、スカラ関数とテーブル値関数を必ず読んでください。

CREATE FUNCTION [schema].[yourFUnctionname] (@start_time datetime, @end_time datetime, @address int)  
RETURNS 
@ReturnTable table(
    column1 decimal(18,2), 
    column2 varchar(16) 
    --etc... do this for all return columns 
) 
AS 
BEGIN 

--DECLARE @start_time DATETIME ='2016-6-27 07:00:00'; 
-- DECLARE @end_time DATETIME ='2016-6-27 15:00:00'; 
-- DECLARE @address INT = 53; 
-- BEGIN 

INSERT INTO @ReturnTable (column1, column2) --make sure you use all the columns 

     SELECT (t1-totalhopper_01)* 0.002204622621 AS HPR1,(t2-totalhopper_02)* 0.002204622621 AS HPR2,(t3-totalhopper_03)*0.002204622621 AS HPR3,(t4-totalhopper_04)*0.002204622621 AS HPR4,(t5-totalhopper_05)*0.002204622621 AS HPR5,(t6-totalhopper_06)* 0.002204622621 AS HPR6 
      FROM(
        SELECT TOP 1 ROW_NUMBER() OVER(ORDER BY totalhopper_01 ASC) AS rownuma,TotalHopper_01,TotalHopper_02,TotalHopper_03,TotalHopper_04,TotalHopper_05,TotalHopper_06 FROM mm_Cycle_Data 
        WHERE TotalHopper_01 IS NOT NULL 
         AND TotalHopper_02 IS NOT NULL 
         AND TotalHopper_03 IS NOT NULL 
         AND TotalHopper_05 IS NOT NULL 
         AND TotalHopper_06 IS NOT NULL 
         AND t_stamp= (SELECT MIN(t_stamp) FROM mm_Cycle_Data WHERE get_address = @address AND T_stamp BETWEEN @start_time AND @end_time) 
       )a 

      LEFT JOIN(

         SELECT TOP 1 ROW_NUMBER() OVER(ORDER BY totalhopper_01 ASC) AS rownum,TotalHopper_01 AS T1,TotalHopper_02 AS t2,TotalHopper_03 AS t3 ,TotalHopper_04 AS t4,TotalHopper_05 AS t5,TotalHopper_06 AS t6 FROM mm_Cycle_Data 
         WHERE TotalHopper_01 IS NOT NULL 
          AND TotalHopper_02 IS NOT NULL 
          AND TotalHopper_03 IS NOT NULL 
          AND TotalHopper_05 IS NOT NULL 
          AND TotalHopper_06 IS NOT NULL 
          AND t_stamp= (SELECT MAX(t_stamp) FROM mm_Cycle_Data WHERE get_address = @address AND T_stamp BETWEEN @start_time AND @end_time) 
        )ac 
      ON rownuma=rownum 
RETURN 
END 
GO 
+0

これは正しいが、私はインライン関数を実行するだけだ。 –

+0

合意。私は彼が彼の実際のレイアウトよりも一般的にテーブル機能に重点を置いていると思っていたので、私は彼のレイアウトを保ちました – scsimon

+0

私はスカラー関数でSELECTステートメントを置き換えました:INSERT INTO @mtrl_totals SELECT isnull([moldingdata]。[dbo] .fn_HPR1_mtrl_used (@アドレス、@ start_time、@end_time)、0); – Jad

関連する問題