Как написать выделенный регистр в T-SQL - PullRequest
2 голосов
/ 17 февраля 2012

как я могу написать оператор выбора в T-SQL?Мой код ниже не работает, помогите, я просто хочу регистр совпадений, вставьте оператор start, вставьте значение в таблицу.

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

Ответы [ 2 ]

8 голосов
/ 17 февраля 2012

Я согласен с комментарием @Джона Дьюи: у вас не должно быть столбца для каждого дня недели, а должен быть один столбец с днем ​​недели.Предполагая на мгновение, что вы не можете исправить неисправную схему, затем вам нужно понять, что 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 голосов
/ 17 февраля 2012

Пожалуйста, попробуйте это.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...