我有以下查询:
SELECT
c.callID,
c.time,
c.duration,
(case_statement) AS inquiry_type
FROM calls AS c
我的问题是关于构建case_statement。还有另一个表call_hco
将calls
和hco
关联在一起。
我需要case_statement
callID
hco = 61
call_hco
inquiry_type
表{}} callID
将是"服务"。如果hco = 52
有hco = 54
或hco = 56
或inquiry_type
,则inquiry_type
将为"销售"否则call_hco
将为& #34; NULL&#34 ;.
值得一提的是,如果您在callID
上查询特定callID
,则可以返回一行或多行,因为相同的hco
可能会与多个{{1}相关联}}
查询结果应如下所示:
callID time duration(seconds) inquiry_type
12 15:35 55 Service
15 10:56 135 Sales
16 18:36 45 NULL
18 13:00 234 Sales
非常感谢任何帮助。
答案 0 :(得分:3)
值得一提的是,如果您在call_hco上查询特定的callID,它可以返回一行或多行,因为相同的callID可能与多个hco相关联。
要正确回答这个问题,我们需要知道你是如何决定的
call_hco
记录是正确的。有时间戳吗? hco字段是一个进展(所以最高的数字总是赢)?您想为该通话显示多个结果吗?
如果没有这些信息,我们只会猜测。
那就是说,我会猜测这可能足以让你自己完成。尝试使用APPLY操作,就像使用JOIN一样,将原始表中的每条记录限制为添加的表中的一条匹配记录:
SELECT
c.callID,
c.time,
c.duration,
CASE WHEN h.hco = 61 THEN 'Service' WHEN h.hco IN (52,54,56) THEN 'Sales' ELSE NULL END AS inquiry_type
FROM calls AS c
OUTER APPLY (
SELECT TOP 1 hco
FROM call_hco
WHERE call_hco.callID = c.callID
AND call_hco.callID IN (52,54,56,61)
ORDER BY hco DESC) h
再次......这里的ORDER BY
是一个疯狂的猜测,可能不是你想要的,但你可以使用这种技术来获得你真正想要的记录。
因为您只需要来自call_hco
的一个字段,所以您也可以使用select子句中的相关派生表(子查询)执行此操作,并可能将其抽象到CTE以使查询更易于理解和维护。但是我发现APPLY更容易使用,并且可以很容易地从相关表中获取其他字段。
你可以使用hco_type
表格看起来更好:
hco type 61 Service 52 Sales 54 Sales 56 Sales
然后你可以通过加入这个新表来简化CASE
表达式:
SELECT
c.callID,
c.time,
c.duration,
t.type
FROM calls AS c
OUTER APPLY (
SELECT TOP 1 hco
FROM call_hco
WHERE call_hco.callID = c.callID
AND call_hco.callID IN (52,54,56,61)
ORDER BY hco DESC) h
LEFT JOIN hco_type t ON t.hco = h.hco
答案 1 :(得分:0)
这很简单,因为你已经规定了条件。容易搞砸的唯一部分不是将ELSE null
作为最后一个条件:
SELECT
c.callID,
c.time,
c.duration,
CASE
WHEN h.hco = 61 THEN 'Service'
WHEN h.hco in (52,54,56) THEN 'Sales'
ELSE null
END AS inquiry_type
FROM calls AS c
inner join hco_table as h
on c.callID = h.callID
答案 2 :(得分:0)
假设callID是两个表的关键。如果call_hco有多个具有相同callID的行,那么结果中也会有多行:
SELECT
c.callID,
c.time,
c.duration,
CAST (
case h.hco
WHEN 61 THEN 'Service'
WHEN 52 THEN 'Sales'
WHEN 54 THEN 'Sales'
WHEN 56 THEN 'Sales'
ELSE NULL END AS varchar(7)
)
AS inquiry_type
FROM calls AS c
LEFT JOIN call_hco as h
ON h.callID = c.callID
AND h.hco IN ( 61, 52, 54, 56 );
编辑:我添加了条款AND h.hco IN (...)
,以避免添加call_hco.hco与这些值不匹配的行。