Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > [mySQL] выборка COUNT'ов с GROUP BY


Автор: Acrobat 13.5.2008, 14:22
Приветствую, такая проблема:
есть таблица, допустим товаров, у каждого товара есть статус от 1 до 5. т.е. мы получаем такую таблицу id, name, status
как мне составить запрос, чтобы выбрать количество всех товаров с группировкой по статусу так, чтобы если у меня нет товаров со статусом 2 запрос вернул количество 0?
т.е. в конечном итоге должно получиться что то вроде:
со статусом 1 - [количество]
со статусом 2 - [количество]
....
со статусом 5 - [количество]

Это нужно для статистики.
Запросом:
Код

SELECT COUNT(*) FROM table GROUP BY status

у меня не получается...
Заранее спасибо за помощь=)

ЗЫ: среда программирования php

Автор: Magnifico 13.5.2008, 14:55
а как изходя из твоей таблицы( id, name, status)
может существовать запись 
с со стаусом 2 но без id и name
т.е
Цитата

1, Морковка, 1
2,Картошка , 1
 ,     , 2

есть подозрения что у тебя там более сложная структура таблиц

Автор: Magnifico 13.5.2008, 15:41
Код

SELECT status , COUNT(*) as Количество  FROM @table GROUP BY status
union all
SELECT 2 as status , 0 as Количество 

Автор: Acrobat 13.5.2008, 16:30
нет, мне нужно только показать все статусы и сколько по ним данных, например:

со статусом 1 - [количество]
со статусом 2 - [количество]
....
со статусом 5 - [количество]

Имена не нужны, зря конечно я их в пример таблицы включил.

Автор: Akina 13.5.2008, 18:04
Код

SELECT q1.status, Count(MyTable.id) AS Count
FROM MyTable 
RIGHT JOIN 
(
SELECT MyTable.status
FROM MyTable
GROUP BY MyTable.status
) As q1 
ON MyTable.status = q1.status
GROUP BY q1.status

Само собой если в таблице какого-то статуса ВООБЩЕ нет - его не будет и в результирущей выборке.
Правильно же - создать таблицу статусов, в которой содержатся все возможные значения. И джойнить её вместо подзапроса.
PS. Кавычки расставляй сам.

Автор: Magnifico 13.5.2008, 18:49
Цитата

у каждого товара есть статус от 1 до 5. 
 чтобы если у меня нет товаров со статусом 2 запрос вернул количество 0?

Код

create table Mytable 
(
id int, 
[name] nvarchar(25), 
status int
)
-------------------------------------------
insert into Mytable
select 1,'aaa',1 union all
select 1,'bbb',1 union all
select 2,'ddd',1 union all
select 2,'fff',3 union all
select 3,'ggg',3 union all
select 3,'hhh',3 union all
select 4,'iii',4 

----------------------------------------
SELECT  status , COUNT(*) as Количество  FROM Mytable GROUP BY status
union 
SELECT 
case when not exists(select * from MyTable where status =1 ) then 1 
when not exists(select * from MyTable where status =2 ) then 2 
when not exists(select * from MyTable where status =3 ) then 3
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =2 ) then 2 
when not exists(select * from MyTable where status =3 ) then 3
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =3 ) then 3
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  

Автор: Acrobat 13.5.2008, 20:49
Magnifico, а не слишком много запросов получилось?

Akina, чем отличается твой последний запрос от, например моего?
Код

SELECT COUNT(*) FROM table GROUP BY status

Автор: Akina 13.5.2008, 23:49
Цитата(Acrobat @  13.5.2008,  21:49 Найти цитируемый пост)
чем отличается твой последний запрос от, например моего?

Независимостью от диалекта. 
 smile По-моему, только MySQL отличается этой идиотской особенностью - пихает что ни попадя в Group By и смешивает поля из разных записей при группировке.

Автор: Deniz 14.5.2008, 05:31
Magnifico, что-то сложный запрос получился, может лучше
Код

select 1, count(*) from MyTable where status = 1
union
select 2, count(*) from MyTable where status = 2
union
select 3, count(*) from MyTable where status = 3
union
select 4, count(*) from MyTable where status = 4
union
select 5, count(*) from MyTable where status = 5


Добавлено через 52 секунды
А вообще
Цитата(Akina @  13.5.2008,  21:04 Найти цитируемый пост)
Правильно же - создать таблицу статусов, в которой содержатся все возможные значения. И джойнить её вместо подзапроса.


Автор: Acrobat 14.5.2008, 09:03
Всем спасибо за ответы, многое понял)

Автор: Magnifico 14.5.2008, 09:24
Цитата

Magnifico, а не слишком много запросов получилось?

Да слишком - но это то что первое в голову пришло (а для оптимизаци нужно время )
тем более  DENIZ тебе уже дал более оптимизированный запрос

Deniz  +1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)