2011-09-01 13 views
5

Zazwyczaj czuję się pewnie z zapytaniami SQL, ale ten ma mnie podrapany w głowę. Czuję, że to powinna być szybka naprawa, ale po prostu jej nie widzę.MySQL: Jak liczyć z kolumn oddzielnie?

Próbuję wykonać liczenie na wielu wartościach w tej samej tabeli, w jednym zapytaniu.

Nie przejmuj się tym, że "0000000000000000" reprezentuje pustą tablicę bajtów.

Czy istnieje prosty sposób na połączenie tych zapytań?

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... 

Odpowiedz

2

można zrobić coś takiego -

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

Czy mogę w jakiś sposób obrócić stół? Chodzi o to, że fajniej byłoby mieć moje kafelki jako nagłówki, a nie wartości. – theangryhornet

+2

Można umieścić UNION ALL zamiast UNION, tylko po to, aby zaoszczędzić serwer SQL trochę nadmiarowej pracy. – James

1

Spróbuj z UNII

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

Chciałbyś użyć tutaj "UNION ALL". Jeśli dwie (lub nawet wszystkie trzy) liczby są takie same, "UNION" wyeliminuje je jako duplikaty. –

+0

Nie jestem pewien, czy podoba mi się ten, ponieważ nie można rozróżnić, które liczby są które. – theangryhornet

+0

możesz umieścić kolejną kolumnę z opisem, aby rozwiązać ten problem. –

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

To bardzo cholernie fajne. Jak sądzisz, w jaki sposób porównuje się wydajność z rozwiązaniami "związkowymi" poniżej? – Marvo

+3

@Marvo: Moja standardowa odpowiedź to próba porównania i porównania. Założę się, że byłoby lepiej, ponieważ jest to 1 wybór w porównaniu z 3. –

+0

bardzo interesujące podejście! – theangryhornet

1

Myślę, że to będzie działać?

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