2016-05-18 21 views
2

私のストアドプロシージャの結果セットを結合します。ストアドプロシージャの結果セットを結合する

しかし私はそれが動作し、このようなエラーがスローされていない、UNIONを使用しています:

メッセージ156、レベル15、状態1、行147
キーワード 'UNION' 付近に不適切な構文を。

メッセージレベル102、レベル15、状態1、行251
'END'に近い構文が正しくありません。

また、一時テーブルを入れてみましたが、一度テーブルを再利用すると、一時テーブルが既に存在することがわかります。

ありがとうございます、ありがとうございます。

現在の結果:

lnid  result Score_result 
aaabbbccc 7B  Current 

lnid  result Score_result 
aaabbbccc 4D  Override 

期待される結果:

lnid  result Score_result 
aaabbbccc 7B  Current 
aaabbbccc 4D  Override 

ストアドプロシージャ:

CREATE PROCEDURE [dbo].[Results] 
    [email protected] AS VARCHAR(50) = NULL, 
    [email protected] AS VARCHAR(50) = NULL, 
    [email protected] AS DATETIME, 
    [email protected] AS DATETIME 
AS 
BEGIN 
    DECLARE @LanID AS VARCHAR(50) 
    DECLARE @period AS VARCHAR(50) 
    DECLARE @strtdt AS DATETIME 
    DECLARE @enddt AS DATETIME 

    SET @LanID = 'aaabbbccc' 
    SET @period = 'H1' 
    SET @strtdt ='2015-10-01' 
    SET @enddt = DATEADD(MONTH, 11, @strtdt) 

    IF NOT EXISTS (SELECT * 
        FROM overridetable 
        WHERE AGENT = @LanID 
        AND KRA_HALF = @strtdt 
        AND BIT_CURRENT = 1 
        AND IS_FULL_YEAR = 0) 
    BEGIN 
     IF NOT EXISTS (SELECT * 
         FROM periodictable 
         WHERE repdate BETWEEN @strtdt AND @enddt 
         AND lnid = @LanID 
         AND rep_period = @period) 
     BEGIN 
      IF @period IN ('H1', 'H2') 
       (SELECT  
        lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)), 0) AS VARCHAR) + ' ' + CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result 
           ,'Current' as 'Score_Result' 
       FROM  
        (SELECT 
          repdate, lnid, team_Code, numscre, 
          CASE 
          WHEN cmpscre = 'A' THEN 1 
          WHEN cmpscre = 'B' THEN 2 
          WHEN cmpscre = 'C' THEN 3 
          END AS cmpscre, 
          rep_period, 1 AS CounterOfRep, 
          CASE 
          WHEN rep_period IN ('Q1','Q2') THEN 'H1' 
          WHEN rep_period IN ('Q3','Q4') THEN 'H2' 
          END AS HalfYearPeriod 
         FROM 
          periodictable 
         WHERE 
          rep_period LIKE 'Q%' 
          AND repdate BETWEEN @strtdt AND @enddt) tmp 
       WHERE  
        lnid = @LanID 
        AND halfyearperiod = @period 
       GROUP BY  
        HalfYearPeriod, lnid, team_code) 

      ELSE IF @period IN ('FY') 
       (SELECT  
        lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) AS VARCHAR) + ' ' + CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result    
           ,'Current' as 'Score_Result' 
       FROM   
        (SELECT 
         repdate, lnid, team_Code, numscre, 
         CASE 
          WHEN cmpscre = 'A' THEN 1 
          WHEN cmpscre = 'B' THEN 2 
          WHEN cmpscre = 'C' THEN 3 
         END AS cmpscre, 
         rep_period, 1 AS CounterOfRep, 
         'FY' AS FullYearPeriod 
        FROM 
         periodictable 
        WHERE 
         rep_period LIKE 'Q%' 
         AND repdate BETWEEN @strtdt AND @enddt) tmp 
       WHERE  
        lnid = @LanID 
        AND FullYearPeriod = @period 
       GROUP BY  
        FullYearPeriod, lnid, team_code) 

        ELSE 

        (SELECT  lnid, CAST (numscre AS VARCHAR) + ' ' + 
           CAST (cmpscre AS VARCHAR) Result 
           ,'Current' as 'Score_Result' 
        FROM  periodictable 
        WHERE  lnid = @LanID 
           AND rep_period = @period 
           AND rep_period LIKE 'Q%' 
           AND repdate BETWEEN @strtdt AND @enddt) 

      END 

     ELSE 

      BEGIN 

       (SELECT  lnid, CAST(numscre AS VARCHAR) + ' ' + CAST(cmpscre AS VARCHAR) AS Result 
          ,'Current' as 'Score_Result' 
       FROM  periodictable 
       WHERE  repdate between @strtdt AND @enddt 
          AND lnid = @LanID 
          AND rep_period = @period) 
      END 

    END 

    ELSE 

    BEGIN 

     (SELECT Agent AS lnid, CAST(CAST(ROUND(Numerical_Override, 0) AS INT) AS VARCHAR) + ' ' + 
       CAST((CASE WHEN Competency_Override = 1 THEN 'A' 
          WHEN Competency_Override = 2 THEN 'B' 
          WHEN Competency_Override = 3 THEN 'C' ELSE '*' END) AS VARCHAR) AS Result 
       ,'Current' as 'Score_Result' 
     FROM overridetable 
     WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 


    END 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 






IF EXISTS 

    (SELECT * 
    FROM overridetable 
    WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 




    BEGIN 

      IF NOT EXISTS 

      (SELECT  * 
      FROM  periodictable 
      WHERE  repdate BETWEEN @strtdt AND @enddt 
         AND lnid = @LanID 
         AND rep_period = @period) 


       BEGIN 


        IF   @period IN ('H1', 'H2') 

        (SELECT  lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) AS VARCHAR) + ' ' + 
           CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result 
           ,'Override' as 'Score_Result' 
        FROM  (SELECT repdate, lnid, team_Code, numscre, 
           CASE WHEN cmpscre = 'A' THEN 1 
             WHEN cmpscre = 'B' THEN 2 
             WHEN cmpscre = 'C' THEN 3 END AS cmpscre, 
           rep_period, 1 AS CounterOfRep, 
           CASE WHEN rep_period IN ('Q1','Q2') THEN 'H1' 
             WHEN rep_period IN ('Q3','Q4') THEN 'H2' END AS HalfYearPeriod 
           FROM periodictable 
           WHERE rep_period LIKE 'Q%' 
             AND repdate BETWEEN @strtdt AND @enddt)tmp 
        WHERE  lnid = @LanID 
           AND halfyearperiod = @period 
        GROUP BY HalfYearPeriod,lnid, team_code) 


        ELSE IF  @period IN ('FY') 

        (SELECT  lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) AS VARCHAR) + ' ' + 
           CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result    
           ,'Override' as 'Score_Result' 
        FROM  (SELECT repdate, lnid, team_Code, numscre, 
           CASE WHEN cmpscre = 'A' THEN 1 
             WHEN cmpscre = 'B' THEN 2 
             WHEN cmpscre = 'C' THEN 3 END AS cmpscre, 
           rep_period, 1 AS CounterOfRep,'FY' AS FullYearPeriod 
           FROM periodictable 
           WHERE rep_period LIKE 'Q%' 
             AND repdate BETWEEN @strtdt AND @enddt)tmp 
        WHERE  lnid = @LanID 
           AND FullYearPeriod = @period 
        GROUP BY FullYearPeriod,lnid, team_code) 


        ELSE 

        (SELECT  lnid, CAST (numscre AS VARCHAR) + ' ' + 
           CAST (cmpscre AS VARCHAR) Result 
           ,'Override' as 'Score_Result' 
        FROM  periodictable 
        WHERE  lnid = @LanID 
           AND rep_period = @period 
           AND rep_period LIKE 'Q%' 
           AND repdate BETWEEN @strtdt AND @enddt) 

      END 

     ELSE 

      BEGIN 

       (SELECT  lnid, CAST(numscre AS VARCHAR) + ' ' + CAST(cmpscre AS VARCHAR) AS Result 
          ,'Override' as 'Score_Result' 
       FROM  periodictable 
       WHERE  repdate between @strtdt AND @enddt 
          AND lnid = @LanID 
          AND rep_period = @period) 
      END 


    END 

    ELSE 

    BEGIN 

    (SELECT @LanID AS lnid, '--' AS Result, 
      'Override' as 'Score_Result') 

    END 

END 
+0

あなたが何を意味しますか? SPは正常に動作しています。あなたはUNIONがまだ機能すると言っていますか? – lucas

+0

ストアドプロシージャにUNIONという単語が含まれていません。実行しようとしているクエリは何ですか? –

+0

こんにちは、ちょうどUNIONが2つのクエリ(長いコメントが配置されている)の区切りに置かれていると想像してください。私は実際に働いている質問を提示するためにそれを取り出しました。ありがとう。 – lucas

答えて

2

あなたはBEGINどこかが必要です。

元のストアドプロシージャは正常に動作しているため、最も簡単な方法は2つのテンポラリテーブルを作成することです。元のselectを実行する場合はselect intoを実行します。そして最後に、union両方のテンポラリテーブルの最後を選択します。

ストアドプロシージャの本体は、次のようなものになります。

create temp table 1 ...... 
create temp table 2 ......... 

IF NOT EXISTS 

(SELECT * 
FROM overridetable 
WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 

BEGIN 
    IF NOT EXISTS (SELECT  * 
     FROM  periodictable 
     WHERE  repdate BETWEEN @strtdt AND @enddt 
        AND lnid = @LanID 
        AND rep_period = @period) 

     BEGIN 

      IF   @period IN ('H1', 'H2') 
       select into temp table 1 
      ELSE IF  @period IN ('FY') 
       select into temp table 1 
      ELSE 
       select into temp table 1 
     END 
    ELSE 
     BEGIN 
      select into temp table 1 
     END 
END 
ELSE 
BEGIN 
    select into temp table 1 
END 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 

IF NOT EXISTS 

(SELECT * 
FROM overridetable 
WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 

BEGIN 
    IF NOT EXISTS (SELECT  * 
     FROM  periodictable 
     WHERE  repdate BETWEEN @strtdt AND @enddt 
        AND lnid = @LanID 
        AND rep_period = @period) 

     BEGIN 

      IF   @period IN ('H1', 'H2') 
       select into temp table 2 
      ELSE IF  @period IN ('FY') 
       select into temp table 2 
      ELSE 
       select into temp table 2 
     END 
    ELSE 
     BEGIN 
      select into temp table 2 
     END 
END 
ELSE 
BEGIN 
    select into temp table 2 
END 

(select * from temp table 1) union (select * from temp table 2) 
+0

はい、これは良いアイデアです!私は今質問に取り組んでいます。私が困ったことがあったら教えてください。ありがとう! – lucas

+0

ありがとう!完璧。あなたの答えを受け入れました!助けてくれてありがとう!! – lucas

+0

@lucasは喜んで助けました:)。 – Ash

関連する問題