Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос с count.  [new]
_ranc1d
Member

Откуда:
Сообщений: 22
Добрый день!

Имеется таблица со следующими полями:

id - идентификатор записи
fio - фио юзера
mkey - маркетинговый код
yesno - ответ (да/нет).

Хотелось бы получить от базы ответ следующего вида:

Количество человек, ответивших да / нет по каждому маркетинговому коду, т.е.:

mkey yes no
1 45 11
2 15 55
3 70 70

общее количество запросов по одному ответу брал подобным запросом...

select mkey, count(*) from table where yesno='y' group by mkey...

пытался объединить запрос, но не знаю как правильно запросить count...

select t1.mkey, count(t1.*???) from table t1 where t1.yesno = 'y'
12 май 11, 15:18    [10642182]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
, yes = sum( case when yesno='y' then cast(1 as int) else cast (0 as int) end ) 
, no = sum( case when yesno='n' then cast(1 as int) else cast (0 as int) end ) 
12 май 11, 15:20    [10642200]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
_ranc1d
Member

Откуда:
Сообщений: 22
Сергей, спасибо!! Ваш код прекрасно работает.

Но у меня возник еще один вопрос. Есть поле comment, которое содержит артикулы товара, перечисленные через пробел (0011 0254 0358 и т.п.).

Как можно сосчитать кол-во артикулов средствами самой бд? пустые поля содержат запись NULL или строку ORDER NO, т.е. выборка должна быть именно по числам.
13 май 11, 13:43    [10647381]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
_ranc1d,

1. за такую архитектуру отбивать руки :(
2. посик по форуму вам покажет 10 варианто как проверть стоку на вхождение чисел (шукать по ISNUMERIC +like)
13 май 11, 13:59    [10647569]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
_ranc1d
Member

Откуда:
Сообщений: 22
Maxx,

насчет архитектуры - не я архитектор, деваться некуда. Спасибо, продолжу поиски
13 май 11, 14:45    [10648046]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Посмотри в сторону:

declare @tb1 table (comment varchar(100))
insert into @tb1 values ('0011 0254 0358 2563 9874 6541'),(null),('ORDER NO'),('1234 5678 9874 6541')
select * from @tb1

select (LEN(comment) - LEN(replace(comment,' ','')))+1 as [cnt] from @tb1
where (comment is not null) and (comment not like '%ORDER NO%')
13 май 11, 14:54    [10648152]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
_ranc1d
Member

Откуда:
Сообщений: 22
Владимир СА,

описанный вами способ работает, насколько я понимаю, считает по пробелам, в таком направлении я и хотел делать подсчет.

Только немного изменил запрос:
select *, cnt =(case when comment != 'order no' then (LEN(comment) - LEN(replace(comment,' ','')))+1 end) from dbo.base
13 май 11, 16:26    [10649181]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
_ranc1d
Владимир СА,

описанный вами способ работает, насколько я понимаю, считает по пробелам, в таком направлении я и хотел делать подсчет.

Только немного изменил запрос:
select *, cnt =(case when comment != 'order no' then (LEN(comment) - LEN(replace(comment,' ','')))+1 end) from dbo.base
Да ради бога...
Только где отсечение null ?
И order no всегда с начала строки ?
13 май 11, 18:58    [10650177]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
iljy
Member

Откуда:
Сообщений: 8711
Владимир СА
Только где отсечение null ?

null != 'order no' будет UNKNOWN, соответственно условие не выполнится, так то явно его отсекать необязательно.
13 май 11, 19:05    [10650193]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
_ranc1d
Member

Откуда:
Сообщений: 22
Владимир СА,

order no с начала строки, да.

А еще один вопрос...а как получить сумму получаемых полей?

я имею ввиду не select field1 + field2 as sumfield, а, например, следующее:

select tb.datein, tb.idproject, tb.mkey, count(tb.id) as total
, yes = sum( case when tb.yesno='y' then cast(1 as int) else cast (0 as int) end )
, prev_yes = (
  select count(*) from dbo.memb t1
  where
  t1.idproject = tb.idproject
  and t1.mkey = tb.mkey
  and t1.yesno = 'y'
  and t1.datein < convert(varchar,Getdate(),104) 
)
from dbo.memb tb
where tb.datein between '01/05/2011' and '01/05/2011'
group by tb.datein, tb.idproject, tb.mkey
order by tb.datein desc, tb.idproject, tb.mkey 

где y - это кол-во ответивших "да" сегодня, а prev_yes - кол-во ответивших "да" за все время до сегодняшнего дня. Так же я хочу получить поле "total" = y+prev_yes
16 май 11, 10:31    [10656555]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
iljy
Member

Откуда:
Сообщений: 8711
_ranc1d,

select tb.datein, tb.idproject, tb.mkey, count(tb.id) as total
, yes = sum( case when tb.yesno='y'  and tb.datein between '01/05/2011' and '01/05/2011'
				then cast(1 as int) else cast (0 as int) end )
, prev_yes = sum(case when tb.yesno='y'  and tb.datein < convert(varchar,Getdate(),104)
				then cast(1 as int) else cast (0 as int) end )
from dbo.memb tb
group by tb.datein, tb.idproject, tb.mkey
order by tb.datein desc, tb.idproject, tb.mkey 
16 май 11, 10:38    [10656604]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
_ranc1d
Member

Откуда:
Сообщений: 22
iljy,

добрый день, простите, а где складывается prev_yes и yes?))

опишу немного подробнее, торопился в предыдущем посте...

я хочу от базы получить следующее:

кол-во ответов "да" за сегодня, кол-во ответов "да" за весь предыдущий срок до сегодняшнего дня, так же с ответом "нет", а так же кол-во total - это ответивших и да, и нет, и ничего не ответивших;

т.е ответ вида

yes prev_yes total_yes no prev_no total_no total
16 май 11, 11:27    [10656990]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
iljy
Member

Откуда:
Сообщений: 8711
_ranc1d,

оберните в подзапрос и во внешнем складывайте что хотите с чем хотите. Для no все абсолютно аналогично.
16 май 11, 12:33    [10657599]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с count.  [new]
_ranc1d
Member

Откуда:
Сообщений: 22
iljy,

сделал так:

select tb.datein, tb.idproject, tb.mkey, count(tb.id) as total
, yes = sum( case when tb.yesno='y' then cast(1 as int) else cast (0 as int) end )
, prev_yes = (
  select count(*) from dbo.memb t1
  where
  t1.idproject = tb.idproject
  and t1.mkey = tb.mkey
  and t1.yesno = 'y'
  and t1.datein < tb.datein 
)
, no = sum( case when tb.yesno='n' then cast(1 as int) else cast (0 as int) end )
, prev_no = (
  select count(*) from dbo.memb t1
  where
  t1.idproject = tb.idproject
  and t1.mkey = tb.mkey
  and t1.yesno = 'n'
  and t1.datein < tb.datein 
)
from dbo.memb tb
where tb.datein between '18/02/2011' and '20/02/2011'
and idproject = '75'
and mkey = '01110628800400001'
group by tb.datein, tb.idproject, tb.mkey
order by tb.datein desc, tb.idproject, tb.mkey

сейчас попробую объяснить))

prev_yes и prev_no - это кол-во ответов за предыдущие дни, до дня рассматриваемого в текущий момент:
dateinidprojectmkeytotalyesprev_yesnoprev_no
20.02.2011 0:00750111062880040000195721
19.02.2011 0:007501110628800400001116110
18.02.2011 0:00750111062880040000131000


еще я хочу добавить столбец total_y и total_n - который будет считать сумму столбцов yes и prev_y (с no - аналогично):

dateinidprojectmkeytotalyesprev_yestotal_yesnoprev_nototal_no
20.02.2011 0:00750111062880040000195712213
19.02.2011 0:00750111062880040000111617101
18.02.2011 0:0075011106288004000013101000
16 май 11, 14:17    [10658412]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить