2016-03-22 86 views
-1

我有2代数据表我需要从查询数据SQL计数多列基于

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 
+1

[如何使用一个SQL查询获取多个计数?]可能的重复?(http://stackoverflow.com/questions/12789396/how-to-get-get-multiple-counts-with-one-sql-query) –

回答

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 
+0

您不需要指定ELSE NULL。这是CASE语句的默认行为。 –

+0

因为所有的编码标准都要求和'else',所以程序员有时候会感到惊讶。我经常只是为了让他们开心,即使我宁愿在大多数时候忽略它。 – shawnt00

+0

@ConsiderMe由于它不会造成任何伤害,我宁愿在可能的情况下明确表示,而不是对计算机做出任何决定。电脑在没有指令的情况下做了愚蠢的事情。但这只是个人喜好/意见。 – morgb

-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(例如:101GROUP BY之前添加以下行:

WHERE M.Machine_ID = '101' 

而且,它似乎是一个坏主意来存储ID作为串。考虑将您的数据类型更改为整数或任何类型。

+0

对此问题进行评价的人可否对此行为为何发表评论? –