2011-05-23 146 views
12

我有一个查询,在其中生成我们每月的客户联系活动。我们有几个类别(发送电子邮件,电子邮件,打电话,打电话等)。有8种不同的“类型”结果。我需要有两个组 - 一个是“电子邮件”,一个是“电话”。目前,我有一个WHERE TYPE LIKE'%Email%'和TYPE LIKE'%Call%'。但是,我无法通过这两个“LIKE”声明进行分组。有谁知道我如何最好地实现这一目标?SQL Group by“Like”

我简化了查询到本作的例子:

SELECT  TYPE 
FROM   dbo.HISTORY 
WHERE  (TYPE LIKE '%email%') OR 
         (TYPE LIKE '%call%') 

回答

17

这应该工作:

SELECT 
    TYPE 
FROM 
    dbo.HISTORY 
WHERE 
    (TYPE LIKE '%email%') OR (TYPE LIKE '%call%') 
GROUP BY 
    CASE 
     WHEN type LIKE '%email%' THEN 'email' 
     WHEN type LIKE '%call%' THEN 'call' 
     ELSE NULL 
    END 

虽然,我的建议是有一个类型代码表与另一列告诉是否每种类型都被视为电子邮件或电话。那么你不会依赖于某种特定格式的类型名称,这种格式肯定会被遗忘。然后,您可以轻松地小组是:

SELECT 
    H.type 
FROM 
    dbo.History 
INNER JOIN dbo.History_Types HT ON 
    HT.history_type_code = H.history_type_code AND 
    HT.history_type_category IN ('Email', 'Call') 
GROUP BY 
    HT.history_type_category 
0

SELECT H.type FROM dbo.History INNER JOIN dbo.History_Types HT ON HT.history_type_code = H.history_type_code 和 HT.history_type_category IN ( '电子邮件', '通话') GROUP BY HT.history_type_category

那岂不是更好地把筛选语句到WHERE子句?

SELECT 
    H.type FROM 
    dbo.History 
    INNER JOIN dbo.History_Types HT ON 
    HT.history_type_code = H.history_type_code 
WHERE **HT.history_type_category IN ('Email', 'Call')** 
    GROUP BY HT.history_type_category