-2

一位同事给了我这个存储过程并请求帮助以根据其结果创建一个 sql INSERT 语句,但对某些方法有点困惑。例如,我从未见过 sql 中的 CASE 语句。我查了一下,但用途与我得到的不同。

这是存储过程

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

我应该帮助他,但到目前为止我是一个数据库向导,在这里有点超出我的深度。我非常感谢您的帮助/建议/指导。

非常感谢!

4

2 回答 2

2

这是可能对您有用的快速示例。这假定您要向其中插入数据的表采用从SELECT语句返回的所有值并且它们属于同一类型。

附带说明一下,您可能对这些语句感到有些困惑的原因可能CASE是因为在 SQL 中使用它们的主要方法有两种。CASE WHEN...就像你在这里和CASE #value# WHEN #result# THEN...。在网络上进行更多搜索将引导您找到一些很好的示例。比如这个

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
于 2013-04-29T14:34:13.703 回答
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
于 2013-04-30T05:38:25.927 回答