2016-04-14 21 views
1

den olduğunda sütunlarında eşit değerlere göre gruplandırmak yapılamıyor This sonuçlanır ideğerler case ifadesi

SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(c.date_of_birth) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(c.date_of_birth, 5)) as age, count(a.id) as occurences, a.celex_id, 

COUNT(CASE WHEN c.gender = 'MALE' THEN c.id END) as males, 
COUNT(CASE WHEN c.gender = 'FEMALE' THEN c.id END) as females, 
COUNT(CASE WHEN c.gender IS NULL THEN c.id END) as unknowns 

FROM consumer c, account a 

WHERE a.consumer_id = c.id 

GROUP BY age, a.celex_id; 

oluşturulan bir görünümüdür.

Şimdi, bir case deyimiyle bir sorgu yaptık ama vakaların göre gruplandırmak alamıyorum, bu sorgu

SELECT 
CASE 
    WHEN age BETWEEN 0 AND 10 THEN '0-10' 
    WHEN age BETWEEN 11 AND 20 THEN '11-20' 
    WHEN age BETWEEN 21 AND 30 THEN '21-30' 
    WHEN age BETWEEN 31 AND 40 THEN '31-40' 
    WHEN age BETWEEN 41 AND 50 THEN '41-50' 
    WHEN age BETWEEN 51 AND 60 THEN '51-60' 
    WHEN age BETWEEN 61 AND 70 THEN '61-70' 
    WHEN age BETWEEN 71 AND 80 THEN '71-80' 
    WHEN age BETWEEN 81 AND 90 THEN '81-90' 
    WHEN age BETWEEN 91 AND 100 THEN '91-100' 
    WHEN age > 100 THEN 'Greater than 100' 
ELSE 'Unknown' 
END AS age_range, males, females, unknowns 
FROM age_gender_occurences 
WHERE celex_id = 1 
GROUP BY age_range, males, females, unknowns 

Bu

age_range | males | females | unknowns 
-------------------------------------- 
11-20  | 0  | 1  | 0 
21-30  | 0  | 1  | 0 
61-70  | 0  | 1  | 0 
61-70  | 1  | 0  | 0 
61-70  | 0  | 0  | 1 

verir ben kopyalayan denedi doğrudan GROUP BY deyiminde durum bildirimi, ancak bu çalışmaz. Birisi yaş_adımı nasıl alabileceğime dair bir ışık tutabilir mi? (61-70, 3 yerine 1 satır olur)

+0

"GROUP BY" öğesinin nasıl çalıştığını öğrenin. GROUP BY x, y, z, "x/y/z kombinasyonu başına bir sonuç satırı istiyorum" anlamına gelir. Age_range başına bir sonuç satırı istersiniz, bu yüzden GROUP BY age_range' sadece buna göre grubun. –

cevap

1

Toplama işlevlerini kaçırıyorsunuz. Eğer bakış açısından bunu yazmak istiyorsanız (gereğinden fazla görünüyor)

SELECT (CASE WHEN age BETWEEN 0 AND 10 THEN '0-10' 
      WHEN age BETWEEN 11 AND 20 THEN '11-20' 
      WHEN age BETWEEN 21 AND 30 THEN '21-30' 
      WHEN age BETWEEN 31 AND 40 THEN '31-40' 
      WHEN age BETWEEN 41 AND 50 THEN '41-50' 
      WHEN age BETWEEN 51 AND 60 THEN '51-60' 
      WHEN age BETWEEN 61 AND 70 THEN '61-70' 
      WHEN age BETWEEN 71 AND 80 THEN '71-80' 
      WHEN age BETWEEN 81 AND 90 THEN '81-90' 
      WHEN age BETWEEN 91 AND 100 THEN '91-100' 
      WHEN age > 100 THEN 'Greater than 100' 
      ELSE 'Unknown' 
     END) AS age_range, 
     SUM(CASE WHEN c.gender = 'MALE' THEN 1 ELSE 0 END) as males, 
     SUM(CASE WHEN c.gender = 'FEMALE' THEN 1 ELSE 0 END) as females, 
     SUM(CASE WHEN c.gender IS NULL THEN 1 ELSE 0 END) as unknowns 
FROM consumer c JOIN 
    account a 
    ON a.consumer_id = c.id 
WHERE celex_id = 1 
GROUP BY age_range; 

: Ben orijinal tablolar açısından bu yazardı başka deyişle

SELECT (CASE WHEN age BETWEEN 0 AND 10 THEN '0-10' 
      WHEN age BETWEEN 11 AND 20 THEN '11-20' 
      WHEN age BETWEEN 21 AND 30 THEN '21-30' 
      WHEN age BETWEEN 31 AND 40 THEN '31-40' 
      WHEN age BETWEEN 41 AND 50 THEN '41-50' 
      WHEN age BETWEEN 51 AND 60 THEN '51-60' 
      WHEN age BETWEEN 61 AND 70 THEN '61-70' 
      WHEN age BETWEEN 71 AND 80 THEN '71-80' 
      WHEN age BETWEEN 81 AND 90 THEN '81-90' 
      WHEN age BETWEEN 91 AND 100 THEN '91-100' 
      WHEN age > 100 THEN 'Greater than 100' 
      ELSE 'Unknown' 
     END) AS age_range, 
     SUM(males) as males, 
     SUM(females) as females, 
     SUM(unknowns) as unknowns 
FROM age_gender_occurences 
WHERE celex_id = 1 
GROUP BY age_range; 

, bir araya toplamak gerekiyor tekrar. Ve aslında, MySQL bu durumda iki toplama yapacak, bu yüzden sadece orijinal tabloları kullanarak daha basit bir sürümünü tavsiye ediyorum.

+0

Sorgunuzdan bazı hatalar oluştu, ancak onları çalıştırdığımda doğru sonuçları aldım, teşekkürler! – Kjetil

+0

@Daniel. . . Cevabı düzeltebilir veya hataların ne olduğunu bana bildirebilirsiniz. –