Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Несколько СOUNT с разными параметрами


Автор: Lorigin 28.10.2009, 14:12
Добрый день.. 

в базе calendar хранится id-юзера и дата установки статуса и сам статус, нужно вывести сколько опредленного статуса на каждый месяц.. 

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

Код

SELECT COUNT( * ) , users.name
FROM 
calendar, 
users
WHERE calendar.status =1
AND DATE_FORMAT( calendar.date, '%m.%Y' ) = '10.2009'
AND calendar.userid = users.id
GROUP BY calendar.userid

Автор: Zloxa 28.10.2009, 14:32
Код

SELECT COUNT( case when DATE_FORMAT( calendar.date, '%m.%Y' ) = '10.2009' then 1 end ) oct 
      ,COUNT( case when DATE_FORMAT( calendar.date, '%m.%Y' ) = '11.2009' then 1 end ) nov             
      , users.name
FROM 
calendar, 
users
WHERE calendar.status =1
AND DATE_FORMAT( calendar.date, '%m.%Y' ) in( '10.2009','11.2009')
AND calendar.userid = users.id
GROUP BY calendar.userid

Автор: DimW 28.10.2009, 14:53
еще вариант:
Код

SELECT sum(case when DATE_FORMAT(calendar.date, '%m') = '10' then 1 else 0 end) oct
      ,sum(case when DATE_FORMAT(calendar.date, '%m') = '11' then 1 else 0 end) nov
      ,users.name
  FROM calendar
      ,users
 WHERE calendar.status = 1
   AND DATE_FORMAT(calendar.date, '%Y') in ('2009')
   AND calendar.userid = users.id
 GROUP BY calendar.userid


Lorigin, СУБД какая?
а то фиг знает как будет считать count(null) в примере от Zloxa и вообще null ли там будет вслучае есть месяц не 10 и не 11

Автор: Zloxa 28.10.2009, 15:00
Цитата(DimW @  28.10.2009,  14:53 Найти цитируемый пост)
а то фиг знает как будет считать count(null) в примере от Zloxa и вообще null ли там будет вслучае есть месяц не 10 и не 11 

А что, действительно есть основания полагать, что  гдето  это не так?
 smile 

Автор: DimW 28.10.2009, 15:06
Цитата(Zloxa @  28.10.2009,  15:00 Найти цитируемый пост)
А что, действительно есть основания полагать

последнее время я вообще ни вчем не уверен, особенно когда узнал что в mssql null и пустая строка это не одно и то же.  smile 
ну и sum предсказуемей выглядит нежели count.

Автор: Deniz 28.10.2009, 15:11
Цитата(Lorigin @  28.10.2009,  17:12 Найти цитируемый пост)
вот так получаю за октябрь, а возможно ли сразу за все мясяцы получить таблицу... ???
а все месяцы должны быть в столбцах или строках?

Автор: DimW 28.10.2009, 15:18
Цитата(Deniz @  28.10.2009,  15:11 Найти цитируемый пост)
а все месяцы должны быть в столбцах или строках? 

судя по групперовки в примере -  в столбцах. да и выносить пользователей в столбцы имхо безсмысленно.

Автор: Deniz 28.10.2009, 15:37
Цитата(DimW @  28.10.2009,  18:18 Найти цитируемый пост)
судя по групперовки в примере -  в столбцах
из сообщения автора не совсем понятно, что он хочет.
Может быть 2 варианта запроса:
1 вариант: 
user1 CountMes1, CountMes2, CountMes3, CountMes4 ...
user2 CountMes1, CountMes2, CountMes3, CountMes4 ...
2 вариант:
user1 CountMes1
user1 CountMes2
user1 CountMes3
user1 CountMes4
user2 CountMes1
user2 CountMes2
user2 CountMes3
user2 CountMes4
...

Автор: Lorigin 28.10.2009, 15:45
Спасибо большое всем... 

сделал через SUM, так:

Код

SELECT
              jos_users.name,
              SUM(MONTH(jos_ccalendar.date)=1) cnt1, 
              SUM(MONTH(jos_ccalendar.date)=2) cnt2, 
              SUM(MONTH(jos_ccalendar.date)=3) cnt3, 
              SUM(MONTH(jos_ccalendar.date)=4) cnt4, 
              SUM(MONTH(jos_ccalendar.date)=5) cnt5, 
              SUM(MONTH(jos_ccalendar.date)=6) cnt6, 
              SUM(MONTH(jos_ccalendar.date)=7) cnt7, 
              SUM(MONTH(jos_ccalendar.date)=8) cnt8, 
              SUM(MONTH(jos_ccalendar.date)=9) cnt9, 
              SUM(MONTH(jos_ccalendar.date)=10) cnt10, 
              SUM(MONTH(jos_ccalendar.date)=11) cnt11, 
              SUM(MONTH(jos_ccalendar.date)=12) cnt12 
          FROM 
              jos_ccalendar, 
              jos_users
          WHERE 
              jos_ccalendar.status=$status AND
              jos_ccalendar.date>='".$year."-01-01' AND
              jos_ccalendar.date<'".($year+1)."-01-01' AND
              jos_ccalendar.userid = jos_users.id
          GROUP BY 
              jos_ccalendar.userid, 
              jos_users.name
          ORDER by NAME

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