2011-09-01 18 views
5

Genellikle, SQL sorguları konusunda oldukça emin hissediyorum, ancak bu bana kafamı kaşımıyor. Bu gibi hissediyorum - hızlı bir düzeltme olabilir, ama göremiyorum.MySQL: Sütunlardan ayrı olarak nasıl sayılır?

Tek bir sorguda aynı tabloda birden çok değer üzerinde sayım yapmaya çalışıyorum.

"0000000000000000" yalnızca boş bayt dizisini temsil ediyor.

Bu sorguları birleştirmenin kolay bir yolu var mı? İşe yarayacağını tahmin

SELECT COUNT(ssn) AS patient_count, 'ssn' AS count_type 
FROM patients 
WHERE ssn="0000000000000000"; 
UNION 
SELECT COUNT(firstname) AS patient_count, 'firstname' AS count_type 
FROM patients 
WHERE firstname="0000000000000000" 
UNION 
SELECT COUNT(lastname) AS patient_count, 'lastname' AS count_type 
FROM patients 
WHERE lastname="0000000000000000" 

cevap

2

BİRLİĞİ ile deneyin?

SELECT * 
FROM 
(SELECT COUNT(ssn) AS ssn_count 
FROM patients 
WHERE ssn="0000000000000000") AS ssn 
CROSS JOIN 
(SELECT COUNT(firstname) AS firstname_count 
FROM patients 
WHERE firstname="0000000000000000") AS firstname 
CROSS JOIN 
(SELECT COUNT(lastname) AS lastname_count 
FROM patients 
WHERE lastname="0000000000000000") AS lastname 
+0

Tabloyu döndürebilmemin bir yolu var mı? Benim kiremitleri değerler olarak değil, üstbilgiler olarak kullanmak daha güzel olurdu. – theangryhornet

+2

Sadece SQL Server'ı bir miktar gereksiz işten kurtarmak için UNION yerine UNION koyabilirsiniz. – James

1

Böyle bir şey yapabiliriz

SELECT COUNT(ssn) 
FROM patients 
WHERE ssn="0000000000000000"; 
UNION 
SELECT COUNT(firstname) 
FROM patients 
WHERE firstname="0000000000000000" 
UNION  
SELECT COUNT(lastname) 
FROM patients 
WHERE lastname="0000000000000000" 
+2

Burada 'UNION ALL' kullanmak istersiniz. İki (hatta üç üçe) sayımın aynı olması durumunda, "UNION" onları kopya olarak ortadan kaldıracaktır. –

+0

Bunu beğendiğime emin değilim, çünkü hangi sayıların hangileri olduğunu ayırt edemezsiniz. – theangryhornet

+0

Bu –

6
SELECT SUM(CASE WHEN ssn = '0000000000000000' THEN 1 ELSE 0 END) AS ssn_count, 
     SUM(CASE WHEN firstname = '0000000000000000' THEN 1 ELSE 0 END) AS first_count, 
     SUM(CASE WHEN lastname = '0000000000000000' THEN 1 ELSE 0 END) AS last_count 
    FROM patients 
    WHERE ssn = '0000000000000000' 
     OR firstname = '0000000000000000' 
     OR lastname = '0000000000000000' 
+0

çözmek için açıklama ile başka bir sütun koyabilirsiniz Bu oldukça dar güzel. Performansın aşağıdaki "sendika" çözümleriyle karşılaştırıldığını nasıl düşünüyorsunuz? – Marvo

+3

@Marvo: Standart cevabım her ikisini de deneyin ve karşılaştırın. Bu, 1 seçime kıyasla 3 daha iyi olacağını düşünürdüm. –

+0

çok ilginç bir yaklaşım! – theangryhornet

1

-

SELECT COUNT(ssn) 
FROM patients 
WHERE ssn="0000000000000000"; 

SELECT COUNT(firstname) 
FROM patients 
WHERE firstname="0000000000000000" 

SELECT COUNT(lastname) 
FROM patients 
WHERE lastname="0000000000000000" 

etc... 
İlgili konular