繁体   English   中英

SQL Server CASE使用2个不同的表

[英]SQL Server CASE using 2 different Tables

我试图在CASE语句中使用两个不同的表,但确实很挣扎。 我的大部分SQL知识都是自学成才的,因此发现这有点困难!

我想要达到的结果是,如果TC.ClockingStatus为1,则为'24'( 第1个表 );如果不是,则为OP.Status;当'C',则为99;当'I',则为50 ELSE 0 END( 第2个表 )。

这是我当前的声明:

SELECT TOP (100) PERCENT 
    RTRIM(OP.Standard_Op) AS TaskDescription, 
    OP.Op_Number AS OpStep, 
    CAST(CAST(OP.Works_Order_Number AS DECIMAL(12, 2)) AS NVARCHAR(50)) AS OrderCode, 
    CASE OP.Status 
       WHEN 'C' THEN 99 
       WHEN 'I' THEN 50 
       ELSE 0 
    END AS Status, 
    CAST(OP.Op_Number AS varchar(50)) AS OpCode, 
    CAST(CAST(OP.Works_Order_Number AS decimal(12, 2)) AS nvarchar(50)) + '_' + CAST(OP.Op_Number AS nvarchar(50)) AS JobCode, 
    TC.ClockingStatus
FROM         
    dbo.PROGRESS AS OP 
INNER JOIN
    dbo.vOrcData_ActiveOperations AS AW ON AW.Works_Order = OP.Works_Order_Number 
                                        AND AW.Op_Number = OP.Op_Number 
INNER JOIN
    dbo.WOHEAD AS WH ON WH.Works_Order = OP.Works_Order_Number 
INNER JOIN
    dbo.RESOURCE AS RR ON RR.Resource_Code = OP.Original_Resource_Code 
LEFT OUTER JOIN
    dbo.Techman_WOCLOCK AS TC ON OP.Works_Order_Number = TC.OrderCode 
                              AND OP.Op_Number = TC.OpStep 
LEFT OUTER JOIN
    dbo.MEMO_FIELDS_SQL ON dbo.MEMO_FIELDS_SQL.Memo_Unique = OP.Man_Memo_Unique 
LEFT OUTER JOIN
    (SELECT     
         Allocated_WO_Num, Sub_Con_Op_No, 
         MAX(Date_Promised) AS Date_Promised
     FROM          
         dbo.PODETAIL AS PODETAIL_1
     GROUP BY 
         Allocated_WO_Num, Sub_Con_Op_No) AS PODETAIL ON PODETAIL.Allocated_WO_Num = OP.Works_Order_Number 
                                                      AND PODETAIL.Sub_Con_Op_No = OP.Op_Number 
LEFT OUTER JOIN
    (SELECT     
         Works_Order, Operation, 
         SUM(Operation_Time) AS TimeComplete
     FROM          
         dbo.WOCLOCK
     GROUP BY 
         Works_Order, Operation) AS CLOCKEDTIME ON WH.Works_Order = CLOCKEDTIME.Works_Order AND OP.Op_Number = CLOCKEDTIME.Operation

可以在case语句中使用不同的列/表达式,但是您不能像在第一个WHEN之前那样命名该列。

尝试这个:

CASE 
    WHEN TC.ClockingStatus = 1 THEN 24
    WHEN OP.Status = 'C' THEN 99
    WHEN OP.Status = 'I' THEN 50
    ELSE 0 END

WHEN测试中的表达式可以任意复杂。 您甚至可以嵌套CASE语句:

CASE 
    WHEN TC.ClockingStatus = 1 THEN 24        
    ELSE CASE OP.Status 
        WHEN 'C' THEN 99
        WHEN 'I' THEN 50
        ELSE 0
    END
END

我认为您的问题是您尝试使用CASE表单:

CASE <Field> WHEN <Value> THEN <Result>

您需要使用以下形式:

CASE WHEN <Any condition no matter how complicated> THEN <Result>

例:

CASE OP.Status WHEN 'C' THEN 99 ELSE 0 END

也可以用作:

CASE WHEN OP.Status='C' THEN 99 ELSE 0 END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM