SQL选择问题

时间:2016-04-03 15:41:43

标签: sql select group-by sql-order-by

我有下表名为Find,我想返回名称同时包含" / topic"的SessionID号码。和" / detail"。因此,它应该在我的情况下返回1,因为只有SessionID = 1同时具有" / topic"和" / detail"在列"名称"。 enter image description here

我尝试使用以下代码,但我想我再次搞砸了GROUP BY。

THX!

         Select count( distinct `SessionID`)
         from Find 
         where `name` like "/detail%" 
           and `name` like "/topic%"  
         group by `SessionID`, `date` 
         order by `date`;

我还有一个名为" date"这没有出现在我的截图中。列日期告知收集SessionID的日期。所以我认为我可以按照上面提到的目的将SessionID分组,然后按日期分组。因此,最后,我将了解每天会议ID会议要求的数量。

2 个答案:

答案 0 :(得分:1)

您需要分两步分隔查询。首先,您需要查找包含/details%/topic%的会话。然后你可以数数。

透视名称查找行

SELECT
    SessionID,
    MAX(CASE WHEN name LIKE "/detail%" THEN 1 END) AS hasDetail,
    MAX(CASE WHEN name LIKE "/topic%"  THEN 1 END) AS hasTopic
FROM Find
GROUP BY SessionID

子查询的结果是:

SessionID  hasDetail  hasTopic
---------  ---------  --------
1          1          1
2                     1
3          1          

计算结果

SELECT COUNT(*)
FROM
(
    SELECT
        SessionID,
        MAX(CASE WHEN `name` LIKE "/detail%" THEN 1 END) AS hasDetail,
        MAX(CASE WHEN `name` LIKE "/topic%"  THEN 1 END) AS hasTopic
    FROM Find
    GROUP BY SessionID
) AS A
WHERE A.hasDetail = 1 AND A.hasTopic = 1;

此查询是为MySQL数据库编写的,如果您需要其他SQL语句,请告诉我,如SQL Server的T-SQL。

答案 1 :(得分:0)

您只是需要将日期和计数包含在不同的列中。像这样:

     Select `SessionID`, `date`, count(*) as number
     from Find 
     where `name` like "/detail%" 
       or `name` like "/topic%"  
     group by `SessionID`, `date` 
     order by `date`;