SQL Count基于多个列

时间:2016-03-22 20:44:44

标签: sql sql-server count

我需要2个数据表来查询

中的数据
Machine_ID  Machine_name
101         Computer1
202         Computer2
303         Computer3
404         Computer4

第二张表:

Machine_ID Event_ID Event_date
101        1        03/15/2016
101        1        03/14/2016
101        2        03/15/2016
101        1        03/13/2016
102        1        03/15/2016
102        2        03/15/2016
102        1        03/14/2016
103        2        03/15/2016
103        2        03/14/2016
104        1        03/15/2016

我需要查询的输出在一行中并包含信息:

Machine_ID, 
Machine_Name, 
Count(Machine_ID) where Event_ID='1'
Count(Machine_ID) where Event_ID='2'

我已经尝试了很多方法来编写查询,但是对于正确的语法却不知所措。

这不起作用,但会让我知道我的目标:

Select M.Machine_ID, M.Machine_Name, 
count(Machine_ID) where E.Event_ID='1' and Machine_ID='101', 
count(Machine_ID) where E.Event_ID='2' and Machine_ID='101' 
from Machines M 
join Events E on M.Machine_ID = E.Machine_ID

基于给定数据的输出应为:

101 Computer1 3 1

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT 
    M.Machine_ID, 
    M.Machine_Name, 
    COUNT(CASE WHEN E.Event_ID='1' THEN 1 ELSE NULL END) AS Event1,
    COUNT(CASE WHEN E.Event_ID='2' THEN 1 ELSE NULL END) AS Event2
FROM Machines M 
    JOIN Events E 
    ON M.Machine_ID = E.Machine_ID
GROUP BY M.Machine_ID, M.Machine_Name

答案 1 :(得分:-1)

使用条件聚合:

SELECT 
    M.Machine_ID, 
    M.Machine_Name, 
    SUM(CASE WHEN E.Event_ID = '1' THEN 1 END) AS Event1_cnt,
    SUM(CASE WHEN E.Event_ID = '2' THEN 1 END) AS Event2_cnt
FROM 
    Machines M 
    JOIN Events E 
      ON M.Machine_ID = E.Machine_ID
GROUP BY 
    M.Machine_ID, M.Machine_Name

如果您想将输出仅限制为一个机器ID(例如:101),请在GROUP BY之前添加以下行:

WHERE M.Machine_ID = '101'

此外,将ID存储为字符串似乎是一个坏主意。考虑将数据类型更改为整数或类似内容。