检查子查询中是否存在值

时间:2017-11-09 16:31:58

标签: sql-server

我有以下查询:

SELECT 
   c.callID,
   c.time,
   c.duration,
   (case_statement) AS inquiry_type
FROM calls AS c

我的问题是关于构建case_statement。还有另一个表call_hcocallshco关联在一起。

我需要case_statement callID hco = 61 call_hco inquiry_type表{}} callID将是"服务"。如果hco = 52hco = 54hco = 56inquiry_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

非常感谢任何帮助。

3 个答案:

答案 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与这些值不匹配的行。