2012-02-17 18 views
2

t-sqlでselect case文を書くにはどうしたらいいですか?下のコードがうまくいかず、助けてください 私は大文字小文字を区別したい、文を挿入してテーブルに値を挿入します。T-SQLでselect caseを書く方法

SET @DayName = dbo.GetWeekDayNameOfDate(@SaleDate) 
     SELECT 
      CASE @DayName 
       WHEN 'Sunday' THEN 
        INSERT INTO Tmp_Data(ProductID,ProductName,Sunday,NetProfit) 
        VALUES(@ProductId,@ProductName,@Qty,@Profit); 
       WHEN 'Monday' THEN 
        INSERT INTO Tmp_Data(ProductID,ProductName,Monday,NetProfit) 
        VALUES(@ProductId,@ProductName,@Qty,@Profit); 
       WHEN 'Tuesday' THEN 
        INSERT INTO Tmp_Data(ProductID,ProductName,Tuesday,NetProfit) 
        VALUES(@ProductId,@ProductName,@Qty,@Profit); 
       WHEN 'Wednesday' THEN 
        INSERT INTO Tmp_Data(ProductID,ProductName,Wednesday,NetProfit) 
        VALUES(@ProductId,@ProductName,@Qty,@Profit); 
       WHEN 'Thursday' THEN 
        INSERT INTO Tmp_Data(ProductID,ProductName,Thursday,NetProfit) 
        VALUES(@ProductId,@ProductName,@Qty,@Profit); 
       WHEN 'Friday' THEN 
        INSERT INTO Tmp_Data(ProductID,ProductName,Friday,NetProfit) 
        VALUES(@ProductId,@ProductName,@Qty,@Profit); 
       WHEN 'Saturday' THEN 
        INSERT INTO Tmp_Data(ProductID,ProductName,Saturday,NetProfit) 
        VALUES(@ProductId,@ProductName,@Qty,@Profit); 
      END 
+0

'CASE'節の中に' INSERT'を置くことはできません。 –

+3

Tmp_dataの構造を(ProductID、ProductName、Qty、NetProfit、DayOfWk)に変更します。ここで、DayOfWkは1から7までの整数値を受け入れます。これにより、照会と保守が非常に簡単になります。 –

答えて

8

私は@ジョンデューイさんのコメントに同意する - あなたは、各曜日のための列ではなく、平日を持つ単一の列を持つべきではありません。しばらくの間、壊れたスキーマを修正できないと仮定すると、CASEは、他のいくつかの言語で動作するようなフローステートメントの制御ではなく、値を返す式であることを理解する必要があります。つまり、CASE THEN something THEN go do something elseと言うことはできません。

SET @DayName = dbo.GetWeekDayNameOfDate(@SaleDate); 

INSERT dbo.Tmp_Data(ProductID,ProductName,NetProfit, 
    Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday) 
    SELECT @ProductId,@ProductName,@Profit, 
     CASE @DayName WHEN 'Sunday' THEN @Qty END, 
     CASE @DayName WHEN 'Monday' THEN @Qty END, 
     CASE @DayName WHEN 'Tuesday' THEN @Qty END, 
     CASE @DayName WHEN 'Wednesday' THEN @Qty END, 
     CASE @DayName WHEN 'Thursday' THEN @Qty END, 
     CASE @DayName WHEN 'Friday' THEN @Qty END, 
     CASE @DayName WHEN 'Saturday' THEN @Qty END; 

あなたはまた、また、動的SQLにおけるステートメントを構築することができ:

は、ここであなたがしようとしている冗長性の少なくとも一部を削減するあなたの文を書くための一つの方法です。私が好む方法ではなく、簡潔さのためにそのオプションを含めるだけです。

SET @DayName = dbo.GetWeekDayNameOfDate(@SaleDate); 

DECLARE @sql NVARCHAR(4000); 

SET @sql = N'INSERT dbo.Tmp_Data(ProductID,ProductName,NetProfit,' 
    + @DayName + ') SELECT ' 
     + CONVERT(VARCHAR(12), @ProductId) +',' 
     + '''' + @ProductName + ''',' 
     + CONVERT(VARCHAR(12), @Profit) + ',' 
     + CONVERT(VARCHAR(12), @Qty) + ';'; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 
+0

私はあなたが最初のクエリでいくつかのGROUP BYのものか、PIVOTまたはCROSS JOINが7行、毎週1つずつ。か何か。 – ErikE

+0

@ErikE説明できますか?あなたはクエリを試しましたか?期待していた結果が得られませんでしたか?あなたはただ一つの行が挿入されていることを知っていますか? –

+1

あなたはそうです。私は彼が何をしているのか分からなかった。お邪魔して申し訳ありません! *面白い*テー​​ブルデザイン。 – ErikE

-4

これを試してください。

SET @DayName = dbo.GetWeekDayNameOfDate(@SaleDate) 
SELECT 
    CASE WHEN @DayName = 'Sunday' THEN 
      INSERT INTO Tmp_Data(ProductID,ProductName,Sunday,NetProfit) 
      VALUES(@ProductId,@ProductName,@Qty,@Profit); 
     WHEN @DayName = 'Monday' THEN 
      INSERT INTO Tmp_Data(ProductID,ProductName,Monday,NetProfit) 
      VALUES(@ProductId,@ProductName,@Qty,@Profit); 
     WHEN @DayName= 'Tuesday' THEN 
      INSERT INTO Tmp_Data(ProductID,ProductName,Tuesday,NetProfit) 
      VALUES(@ProductId,@ProductName,@Qty,@Profit); 
     WHEN @DayName= 'Wednesday' THEN 
      INSERT INTO Tmp_Data(ProductID,ProductName,Wednesday,NetProfit) 
      VALUES(@ProductId,@ProductName,@Qty,@Profit); 
     WHEN @DayName= 'Thursday' THEN 
      INSERT INTO Tmp_Data(ProductID,ProductName,Thursday,NetProfit) 
      VALUES(@ProductId,@ProductName,@Qty,@Profit); 
     WHEN @DayName= 'Friday' THEN 
      INSERT INTO Tmp_Data(ProductID,ProductName,Friday,NetProfit) 
      VALUES(@ProductId,@ProductName,@Qty,@Profit); 
     WHEN @DayName= 'Saturday' THEN 
      INSERT INTO Tmp_Data(ProductID,ProductName,Saturday,NetProfit) 
      VALUES(@ProductId,@ProductName,@Qty,@Profit); 
    END 
+1

構文が正しくありません。 –

+0

@Thit、このコードを試しましたか?それとも、それが好きなの? –

+1

upvoted誰でも彼らのコンピュータライセンスを取り消す権利があります。 –