2014-02-15 1 views
0
T1 - id, name, userID (stocks) - not really used in this cased 
T2 - id, name, stockID, userID (categories) 
T3 - id, name, stockID, categoryID, quality, userID (goods) 

колонка «качество» может быть «0» (хорошо) или «1» (плохо), и каждый товар (даже тот же вид) = 1 рядПодсчет строк с различными, где и GROUP BY 1 результат

это SQL (это «далеко» я могу получить), показывают только общее количество хороших и плохих вещей, и если категория существует, но не все строки, то это не показано на конечных результатах:

SELECT T2.name, COUNT(*) AS TOTAL FROM T3 
LEFT JOIN T2 ON T2.id=T3.categoryID 
WHERE T3.stockID=2 GROUP BY T3.categoryID 

Результат:

CATEGORY - TOTAL 
category1 - 1237 
category2 - 857 
category3 - 125 

category4 не показан, так как не существует ни одной строки, но мне нужен каждые одиночные строки были показаны, даже если T3 строка не существует и BAD подсчет материал конечно ..

Желаемой результат:

CATEGORY - BAD/TOTAL 
category1 - 425/1237 
category2 - 326/857 
category3 - 0/125 
category4 - 0/ 0 
+0

внешнее соединение возможно? – luksch

+0

nope, такой же результат .. –

+0

Где sqlfiddle? – Strawberry

ответ

1
SELECT T2.name, SUM(CASE WHEN T3.quality=1 THEN 1 ELSE 0 END)AS BAD, 
     COUNT(*)AS TOTAL 
FROM T2 
LEFT JOIN T3 ON T2.id=T3.categoryID 
WHERE t2.stockid=2 
GROUP BY T2.name; 
+0

Достаточно близко, но все еще не отображается, не существует строк -> category4 - 0/0 –

+0

Вы не можете показать, чего не существует, вам нужна таблица со всеми категории существующих. Может быть, это имя T1.name? – Mihai

+0

T1 является только запасом .. сначала создайте запас, затем категорию, затем товар .. и если вы не создадите товар, тогда категория пуста, но все еще существует, потому что кто-то ее создает, и я хочу отобразить категорию как пустой или 0 - 0 или что-то еще .. как я могу это сделать? –

0

Я думаю, вы хотите сделать left join в другом направлении (вы также можете сделать right outer join). И изменить count() рассчитывать соответствующие записи:

SELECT T2.name, coalesce(SUM(t.3bad), 0) as Bad, COUNT(t3.categoryID) AS TOTAL 
FROM T2 LEFT JOIN 
    T3 
    ON T2.id = T3.categoryID and T3.stockID = 2; 
GROUP BY T2.name; 

Кроме того, это хорошая идея, чтобы select те же поля, которые находятся в пункте group by. Действительно, больше, чем хорошая идея. Большинство баз данных (и стандарта) обычно требуют этого. Расширение MySQL до group by может вызвать проблемы.

Обратите внимание, что я переместил условие where в пункт on. Это предотвратит дополнительную фильтрацию, которая удалит нужные строки.

+0

Это также достаточно близко, потому что это показало все, даже если товары находится в другой категории, и количество «BAD stuff» отсутствует. –

Смежные вопросы