Условия SQL-соединения - PullRequest
2 голосов
/ 24 июня 2011

Три стола

cats
=============
id
cat_herder_id
size
color
birthday

collars
=============
id
cat_id
diameter
color
material

cat_herders
=============
id
name
age
height

Я хочу получить ряд для каждого пастуха, который выше метра, с подсчетом количества кошек, родившихся в феврале, оранжевого цвета с черными ошейниками, которые принадлежат этому пастуху, и подсчета всех кошек. которые оранжевого цвета с синими воротничками принадлежат каждому пастуху, как бы мне поступить с запросом такого рода.

Я не думаю, что могу просто указать в выражении where, потому что мой счет выключен, я группируюсь по cat_herders.id

РЕДАКТИРОВАТЬ: менее дезинфицированная, менее отвлеченная версия того, что у меня есть:

SELECT company.tblusers.first_name, company.tblusers.last_name, company.tblusers.userid, SUM(db.tasks.estimated_nonrecurring+db.tasks.estimated_recurring), COUNT(sugarcrm2.ncr_ncr.id),  
SUM(db.batch_log.time_elapsed) FROM company.tblusers 
INNER JOIN db.batch_log ON company.tblusers.userid = db.batch_log.userid 
INNER JOIN db.tasks ON db.batch_log.batch_id = db.tasks.batch_id
INNER JOIN sugarcrm2.ncr_ncr ON company.tblusers.first_name + " " + company.tblusers.first_name = sugarcrm2.ncr_ncr.employee
WHERE  departmentid = 8 AND DATE(db.batch_log.start_time) =  DATE(NOW()) GROUP BY userid

1 Ответ

5 голосов
/ 24 июня 2011

Примечание. В зависимости от вашей РСУБД и типа данных столбца cats.birthday вам, вероятно, потребуется настроить этот запрос, чтобы извлечь месяц рождения, но это дает вам общее представление.

SELECT ch.name,
       SUM(CASE WHEN c.color = 'orange' AND cl.color = 'black' AND c.birthday = 'February' THEN 1 ELSE 0 END) AS OrangeCatsBlackCollarsFeb,
       SUM(CASE WHEN c.color = 'orange' AND cl.color = 'blue' THEN 1 ELSE 0 END) AS OrangeCatsBlueCollars 
    FROM cat_herders ch
        LEFT JOIN cats c
            INNER JOIN collars cl
                ON c.id = cl.cat_id
            ON ch.id = c.cat_herder_id
    WHERE ch.height > 1 /* in meters */
    GROUP BY ch.name
...