2016-03-22 11 views
-1

göreSQL Sayısı birden çok sütun I verilerini sorgulamak için gereken 2 veri tablolar

Machine_ID Machine_name 
101   Computer1 
202   Computer2 
303   Computer3 
404   Computer4 

İkinci tabloda:

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 

Bir uyumlu olduğu sorgu çıktısını gerekir ve tutan bilgi:

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

Ben sorguyu yazmak ancak doğru sözdizimi için bir kayıp am için çeşitli yollar denedi.

Bu çalışmıyor ama gidiyorum bir fikir verecektir

: olmalı

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 

verilen verilere dayalı bu çıktı:

101 Computer1 3 1 
+1

Olası yinelenen [Bir SQL sorgusuyla birden çok sayı nasıl alınır?] (Http://stackoverflow.com/questions/12789396/how-to-get-multiple-counts-with-one-sql-query) –

cevap

0

bu deneyin:

:
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 belirtmeniz gerekmez. Bu, CASE ifadesi için varsayılan davranıştır. –

+0

Prosedürel programcılar bazen gerektiren tüm kodlama standartları ve "else" nedeniyle çıldırırlar. Çoğu zaman onları ihmal etmeyi tercih etsem bile onları mutlu tutmak için sık sık içerim. – shawnt00

+0

@ConsiderMe Herhangi bir şeye zarar vermediğinden, bilgisayara karar vermekten ziyade mümkün olan yerlerde açık olmayı tercih ederim. Bilgisayarlar, talimatların yokluğunda aptalca şeyler yaparlar. Ama bu sadece kişisel bir tercih/görüş. – morgb

-1

şartlı agregasyonu kullanın
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 

yalnızca bir makine id (örneğin: 101) çıkışını sınırlamak istiyorsanız GROUP BY önce aşağıdaki satırı ekleyin:

WHERE M.Machine_ID = '101' 

Ayrıca, bir şekilde ID saklamak için kötü bir fikir gibi görünüyor dize. Veri türünüzü tamsayıya veya benzer bir şeye dönüştürmeyi düşünün.

+0

Bu cevabı düşüren kişi, bu işlemin neden yapıldığına dair bir yorum ekleyebilir mi? –

İlgili konular