bugfix> sql > 投稿

CASEステートメントで2つの異なるテーブルを使用しようとしていますが、本当に苦労しています。私のSQLの知識のほとんどは独学なので、少し苦労します。

私が達成しようとしている結果は、TC.ClockingStatus WHEN 1 then '24'(第1表)でない場合WHEN OP.Status WHEN 'C' THEN 99 WHEN 'I' THEN 50 ELSE 0 END(第2表)ASステータス。

これは私の現在の声明です:

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

回答 2 件
  • 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
    
    

あなたの答え