2013-04-03 2 views
11

Попытка использования операторов CASE во внутреннем соединении и все, что я получаю, это синтаксические ошибки, у кого есть какие-либо советы по этому поводу?Case Statement on INNER Join

Вот код

SELECT 
    Call_type_ID, 
    SUM (staging.dbo.outgoing_measure.ring_time) AS Ring_Time, 
    SUM (staging.dbo.outgoing_measure.hold_time) As Hold_Time, 
    SUM (staging.dbo.outgoing_measure.talk_time) AS Talk_Time, 
    SUM (staging.dbo.outgoing_measure.acw_time) AS ACW_Time, 
    COUNT(*) CallCount 
FROM outgoing_measure 

INNER JOIN datamartend.dbo.Call_Type_Dim ON 
CASE 
WHEN 
CTICallType_ID = 1 
AND CTIAgentCallType_ID = 0 
AND Abandoned IS NULL 
AND AnsTime > 0 
AND CallState IS NULL 
THEN Call_Type_ID = 10 
WHEN 
CTICallType_ID = 1 
AND CTIAgentCallType_ID = 0 
AND Abandoned IS NULL 
AND AnsTime > 0 
AND CallState = 1 
THEN call_Type_id = 11 
WHEN 
CTICallType_ID = 1 
AND CTIAgentCallType_ID = 0 
AND Abandoned = 1 
AND AnsTime IS NULL 
AND CallState IS NULL 
THEN call_type_ID = 12 
ELSE call_type_id = 1 
END 

Group by call_Type_id 

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

Ошибки синтаксиса им получать являются:

Неправильный синтаксис на = и когда здесь

THEN Call_Type_ID = 10 
WHEN 

И неправильный синтаксис ожидающей ПРЕОБ на GROUP BY

ответ

19

Похоже, вы пытаетесь создайте Where-clauses в этом случае, но вместо этого вы должны сравнить результат дела с Call_Type_ID (или любым другим полем, которое вы хотите), как в примере, указанном ниже. Надеюсь, это поможет!

Также иногда я использую скобки над моим корпусом, чтобы было легче видеть, с чего они начинают и останавливаются.

INNER JOIN datamartend.dbo.Call_Type_Dim ON 
(CASE 
WHEN CTICallType_ID = 1 
    AND CTIAgentCallType_ID = 0 
    AND Abandoned IS NULL 
    AND AnsTime > 0 
    AND CallState IS NULL 
    THEN 10 
WHEN CTICallType_ID = 1 
    AND CTIAgentCallType_ID = 0 
    AND Abandoned IS NULL 
    AND AnsTime > 0 
    AND CallState = 1 
    THEN 11 
WHEN 
    CTICallType_ID = 1 
    AND CTIAgentCallType_ID = 0 
    AND Abandoned = 1 
    AND AnsTime IS NULL 
    AND CallState IS NULL 
    THEN 12 
ELSE 1 
END) = Call_Type_ID -- Insert something here to join on. 
+0

Я думаю, что вы вполне можете быть правы, как я сказал им новое целое понятие. Спасибо за совет –

-3
select * from emp; 
select * from dept; 

........................................ ...................................

select Ename,Job,dname, 
Case job 
when 'Clerk' then 'C' 
when 'Salesman' then 'S' 
when 'Manager' then 'M' 
when 'Analyst' then 'A' 
else 'Other' 
end as Demo 

от ого внутреннего соединения на emp.deptno=dept.deptno ; отдел

............................................... .................................

Я рассматриваю здесь ta как оракул по умолчанию.