2013-04-29 2 views
-2

Работник предоставил мне эту хранимую процедуру и попросил помочь создать SQL-запрос INSERT на основе его результатов, но я немного смущен некоторым из методов. Например, я никогда не видел инструкцию CASE в sql. Я посмотрел, но использование отличается от того, что мне дано.Как использовать эту хранимую процедуру SQL для создания инструкции INSERT?

Вот хранимая процедура

if @ScheduleType Is Null 
SELECT Lu_Schedule_Types.ScheduleType, 
SUM(CASE WHEN InductionProduction = 1 THEN CASE WHEN (LEFT(DATENAME(Month, 
        3)) = 'JAN' THEN ItemQty END END) AS I01, 
SUM(CASE WHEN InductionProduction = 1 THEN CASE WHEN (LEFT(DATENAME(Month,     
        Item_Schedule.ItemScheduleDate), 3)) 
        = 'FEB' THEN ItemQty END END) AS I02, 
SUM(CASE WHEN InductionProduction = 2 THEN ItemQty ELSE 0 END) AS PRD, 
LmpProjectInfo.PlannedQty, 
LmpProjectInfo.AuthorizedQty, 
LmpProjectInfo.WbsElementID 

FROM Item_Schedule 
INNER JOIN Lu_Schedule_Types 
      ON Item_Schedule.ItemScheduleType = Lu_Schedule_Types.ScheduleTypeId 
RIGHT OUTER JOIN LmpProjectInfo 
      ON Item_Schedule.ItemWbsElement = LmpProjectInfo.WbsElementID 
WHERE 
    (Item_Schedule.IsActive = 1) 
    AND (Item_Schedule.ItemWbsElement = @WbsElement) 
    AND (Item_Schedule.ItemScheduleDate < DATEADD(d, 1, @EndDate)) AND 
    (Item_Schedule.ItemScheduleDate >= @StartDate) 
GROUP BY Lu_Schedule_Types.ScheduleType 
    , Lu_Schedule_Types.ScheduleTypeId 
    , LmpProjectInfo.PlannedQty 
    , LmpProjectInfo.AuthorizedQty 
    , LmpProjectInfo.WbsElementID 
ORDER BY Lu_Schedule_Types.ScheduleTypeId 

Я должен помогать его, но я, безусловно, мастера баз данных, и немного из моей глубины здесь я. Я очень благодарен за помощь/совет/руководство.

Спасибо большое!

+7

Скажите им, что вы из вашей глубины. –

+0

Я сделал хе-хе. его внизу. –

+2

hm, я не уверен, как вы могли бы получить что-то из результатов этой процедуры, поскольку нет результатов, кроме одной вставки. (результаты чаще всего известны как то, что возвращается от выбора) – DrCopyPaste

ответ

2

Это быстрый образец, который может сработать для вас. Это предполагает, что таблица, в которую вы хотите вставить данные, принимает все значения, возвращаемые из оператора SELECT, и что они одного типа.

В качестве побочного примечания причина, по которой вы, возможно, немного запутались в операциях CASE, возможно, связана с тем, что в SQL используются два основных способа их использования. CASE WHEN... как у вас есть здесь и CASE #value# WHEN #result# THEN.... Немного больше поиска в Интернете приведет вас к некоторым приятным примерам. Например, this one.

INSERT INTO TABLE_NAME 
(
    ScheduleType, 
    I01, 
    I02, 
    PRD, 
    PlannedQty, 
    AuthorizedQty, 
    WbsElementID 
) 
SELECT 
Lu_Schedule_Types.ScheduleType, 
SUM(CASE WHEN InductionProduction = 1 THEN CASE WHEN (LEFT(DATENAME(Month, 
        3)) = 'JAN' THEN ItemQty END END) AS I01, 
SUM(CASE WHEN InductionProduction = 1 THEN CASE WHEN (LEFT(DATENAME(Month,     Item_Schedule.ItemScheduleDate), 3)) 
        = 'FEB' THEN ItemQty END END) AS I02, 
SUM(CASE WHEN InductionProduction = 2 THEN ItemQty ELSE 0 END) AS PRD, 
LmpProjectInfo.PlannedQty, 
LmpProjectInfo.AuthorizedQty, 
LmpProjectInfo.WbsElementID 

FROM 
    Item_Schedule INNER JOIN 
    Lu_Schedule_Types ON Item_Schedule.ItemScheduleType = Lu_Schedule_Types.ScheduleTypeId RIGHT OUTER JOIN 
    LmpProjectInfo ON Item_Schedule.ItemWbsElement = LmpProjectInfo.WbsElementID 
WHERE 
    (Item_Schedule.IsActive = 1) AND (Item_Schedule.ItemWbsElement = @WbsElement) AND 
    (Item_Schedule.ItemScheduleDate < DATEADD(d, 1, @EndDate)) AND 
    (Item_Schedule.ItemScheduleDate >= @StartDate) 
GROUP BY Lu_Schedule_Types.ScheduleType, Lu_Schedule_Types.ScheduleTypeId, 
    LmpProjectInfo.PlannedQty, LmpProjectInfo.AuthorizedQty, 
    LmpProjectInfo.WbsElementID 
ORDER BY Lu_Schedule_Types.ScheduleTypeId 
+0

Спасибо всем. Я ценю это. Это очень помогло. –

1

Попробуйте один -

INSERT INTO dbo.table1 -- insert in table 
(
     ScheduleType 
    , I01 
    , I02 
    , PRD 
    , PlannedQty 
    , AuthorizedQty 
    , WbsElementID 
) 
SELECT 
     t.ScheduleType 
    , I01 = SUM(CASE WHEN InductionProduction = 1 AND MONTH(s.ItemScheduleDate) = 1 THEN ItemQty END) 
    , I02 = SUM(CASE WHEN InductionProduction = 1 AND MONTH(s.ItemScheduleDate) = 2 THEN ItemQty END) 
    , PRD = SUM(CASE WHEN InductionProduction = 2 THEN ItemQty END) 
    , i.PlannedQty 
    , i.AuthorizedQty 
    , i.WbsElementID 
--INTO #temp_table -- or insert in temp table 
FROM dbo.Item_Schedule s 
JOIN dbo.Lu_Schedule_Types t ON s.ItemScheduleType = t.ScheduleTypeId 
RIGHT JOIN dbo.LmpProjectInfo i ON s.ItemWbsElement = i.WbsElementID 
WHERE s.IsActive = 1 
    AND s.ItemWbsElement = @WbsElement 
    AND s.ItemScheduleDate < DATEADD(d, 1, @EndDate)) 
    AND s.ItemScheduleDate >= @StartDate 
GROUP BY 
     t.ScheduleType 
    , t.ScheduleTypeId 
    , i.PlannedQty 
    , i.AuthorizedQty 
    , i.WbsElementID 
ORDER BY t.ScheduleTypeId 
Смежные вопросы