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

Откуда:
Сообщений: 6
Доброго дня! Сильно не пинайте за неопытность )
Есть таблица: Поля - fio, vid_id, date.
(В поле ФИО встречаются повторяющиеся Фамилии)
vid_id - числовое и содержит значения от до 5
В результирующей таблице должны быть суммы уникальных значений поля vid_id за определенных период времени, при этом значения поля vid_id должны отображаться в ввиде столбцов. Фамилии не должны повторяться.
Может сумбурно написал. На скрине понятней

Вот так получается взять сумму только по одному полю:
select fio, COUNT(vid_id), as sum from Table1 where vid_id=1 and date between '2010-01-01' and '2014-09-01' group by fio


К сообщению приложен файл. Размер - 8Kb
12 сен 14, 12:09    [16567568]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
F
Guest
Скопируй данные в Excel и сделай сводную таблицу.
12 сен 14, 12:15    [16567602]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx
12 сен 14, 12:19    [16567628]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
mittagswind
Member

Откуда:
Сообщений: 135
GansaleZ, выполни скрипт:

create table #t (fio nvarchar (50), vid_id int, f_date date)

insert #t(fio, vid_id, f_date)
values 
	('Иванов', 1, '20140911'),
	('Петров', 2, '20140911'),
	('Иванов', 1, '20130101'),
	('Сидоров', 4, '20140711'),
	('Семенов', 1, '20140911')


select fio, pvt.[1], pvt.[2], pvt.[3], pvt.[4], pvt.[5] from
(select fio, vid_id 
	from #t where f_date between '20100101' and '20141231'
)as src
pivot (count(vid_id) for vid_id in ([1], [2], [3], [4], [5])) pvt

drop table #t
12 сен 14, 13:13    [16568061]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
vid_id - числовое и содержит значения от до 5

Раз Константа до 5, до быстреее всего будет так:

select fio,
count(case where vid_id = 1 then 1 else null) as 'vid_id = 1',
count(case where vid_id = 2 then 1 else null) as 'vid_id = 2',
count(case where vid_id = 3 then 1 else null) as 'vid_id = 3',
count(case where vid_id = 4 then 1 else null) as 'vid_id = 4',
count(case where vid_id = 5 then 1 else null) as 'vid_id = 5'
from Table1 where date between '2010-01-01' and '2014-09-01' group by fio


--------
Pivot будет гораздо медленнее, он оправдан только если столбцов неизвестное количество
12 сен 14, 13:52    [16568295]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Ivan Durak
Pivot будет гораздо медленнее
Пивот - синтаксический сахар. И преобразуется в те же самые case'ы + group by. Так что "гораздо медленнее" - очередной миф.
12 сен 14, 14:26    [16568533]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
GansaleZ
Member

Откуда:
Сообщений: 6
Ivan Durak
select fio,
count(case where vid_id = 1 then 1 else null) as 'vid_id = 1',
count(case where vid_id = 2 then 1 else null) as 'vid_id = 2',
count(case where vid_id = 3 then 1 else null) as 'vid_id = 3',
count(case where vid_id = 4 then 1 else null) as 'vid_id = 4',
count(case where vid_id = 5 then 1 else null) as 'vid_id = 5'
from Table1 where date between '2010-01-01' and '2014-09-01' group by fio


Думаю, что это именно то, что мне нужно, но: "Неправильный синтаксис около ключевого слова where"
(((
12 сен 14, 14:30    [16568567]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
o-o
Guest
invm,

да видно же, что у человека пятница.
там один case с where но без end зато с else null чего стоит.
да даже если и исправить, ответы разные

...ну и сама фраза про переменное число столбцов...да-да, в пивоте ж их не надо явно перечислять
12 сен 14, 14:32    [16568587]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
select fio,
count(case when vid_id = 1 then 1 else null end) as 'vid_id = 1', 
count(case when vid_id = 2 then 1 else null end) as 'vid_id = 2', 
count(case when vid_id = 3 then 1 else null end) as 'vid_id = 3', 
count(case when vid_id = 4 then 1 else null end) as 'vid_id = 4', 
count(case when vid_id = 5 then 1 else null end) as 'vid_id = 5'
from Table1 where date between '2010-01-01' and '2014-09-01' group by fio
12 сен 14, 14:33    [16568591]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
Maxx_UA
Guest
GansaleZ
Ivan Durak
select fio,
count(case where vid_id = 1 then 1 else null) as 'vid_id = 1',
count(case where vid_id = 2 then 1 else null) as 'vid_id = 2',
count(case where vid_id = 3 then 1 else null) as 'vid_id = 3',
count(case where vid_id = 4 then 1 else null) as 'vid_id = 4',
count(case where vid_id = 5 then 1 else null) as 'vid_id = 5'
from Table1 where date between '2010-01-01' and '2014-09-01' group by fio


Думаю, что это именно то, что мне нужно, но: "Неправильный синтаксис около ключевого слова where"
(((
патамучто RTFM
case WHEN ..... а не case WEHRE
12 сен 14, 14:33    [16568593]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
o-o
Guest
GansaleZ,
да ради бога, вот синтаксически правильное

select fio,
count(case when vid_id = 1 then 1 end) as 'vid_id = 1',
count(case when vid_id = 2 then 1 end) as 'vid_id = 2',
count(case when vid_id = 3 then 1 end) as 'vid_id = 3',
count(case when vid_id = 4 then 1 end) as 'vid_id = 4',
count(case when vid_id = 5 then 1 end) as 'vid_id = 5'
from #t where f_date between '2010-01-01' and '2014-09-01' group by fio
12 сен 14, 14:34    [16568598]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
o-o
invm,

да видно же, что у человека пятница.
Ну да, видно. Но ТС, например, может за чистую монету принять.
12 сен 14, 14:35    [16568613]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
GansaleZ
Member

Откуда:
Сообщений: 6
o-o, Оно Самое!! :-) When ))
Спасибо большое!
И остальным - большущий Thanks!
12 сен 14, 14:41    [16568649]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
o-o
GansaleZ,
да ради бога, вот синтаксически правильное

select fio,
count(case when vid_id = 1 then 1 end) as 'vid_id = 1',
count(case when vid_id = 2 then 1 end) as 'vid_id = 2',
count(case when vid_id = 3 then 1 end) as 'vid_id = 3',
count(case when vid_id = 4 then 1 end) as 'vid_id = 4',
count(case when vid_id = 5 then 1 end) as 'vid_id = 5'
from #t where f_date between '2010-01-01' and '2014-09-01' group by fio
Лучше не COUNT(), а SUM().
Чтобы сообщение про игнорирование NULL в агрегатах не выскакивало.
12 сен 14, 14:59    [16568807]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
iap
o-o
GansaleZ,
да ради бога, вот синтаксически правильное

select fio,
count(case when vid_id = 1 then 1 end) as 'vid_id = 1',
count(case when vid_id = 2 then 1 end) as 'vid_id = 2',
count(case when vid_id = 3 then 1 end) as 'vid_id = 3',
count(case when vid_id = 4 then 1 end) as 'vid_id = 4',
count(case when vid_id = 5 then 1 end) as 'vid_id = 5'
from #t where f_date between '2010-01-01' and '2014-09-01' group by fio
Лучше не COUNT(), а SUM().
Чтобы сообщение про игнорирование NULL в агрегатах не выскакивало.


И дату лучше в формате yyyymmdd чтобы уже совсем кашерно было.
12 сен 14, 15:59    [16569250]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WarAnt
iap
пропущено...
Лучше не COUNT(), а SUM().
Чтобы сообщение про игнорирование NULL в агрегатах не выскакивало.


И дату лучше в формате yyyymmdd чтобы уже совсем кашерно было.
Для типа DATE и так кошерно.
12 сен 14, 16:03    [16569277]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
invm
Ivan Durak
Pivot будет гораздо медленнее
Пивот - синтаксический сахар. И преобразуется в те же самые case'ы + group by. Так что "гораздо медленнее" - очередной миф.
\
я тестил. Замедление в разы, это раз (на 2008-м). Два - в плане отдельный оператор специальный!
12 сен 14, 17:40    [16569713]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
invm
o-o
invm,

да видно же, что у человека пятница.
Ну да, видно. Но ТС, например, может за чистую монету принять.

главное идея... а если ТС не знает как правильно case написать - тут уже я бессилен
12 сен 14, 17:41    [16569720]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Ivan Durak
Два - в плане отдельный оператор специальный!
Какой из перечисленных?
12 сен 14, 18:09    [16569809]     Ответить | Цитировать Сообщить модератору
 Re: Несколько COUNT в одну таблицу  [new]
o-o
Guest
Ivan Durak,

так мы ж синтаксис поправили, а идею (copyright) оставили, все ок!
12 сен 14, 18:09    [16569811]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить