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

Откуда:
Сообщений: 51
Tаблица тb1:

row1 int, n1 int, n2 int, n3 int

row1,номер строчки >50,000

0<n1, n2, n3<51 (1-50)
n3>n2>n1

Mожно воспользоваться таблицей тb2:
num int
-1<num<101 (0-100)
порядковые номера, 101 строчек.


Kак сделать запрос, которыи Count каждого из значении 1-50 в n1, n2, n3 таблицы тб1?

row cn1 cn2 cn3 cn

1
2
3
.
.
.
50

cn1(1) = Count(n1=1)
cn1(i) = Count(n1=i) (0<i<51)
cn2(i) = Count(n2=i) (0<i<51)
cn3(i) = Count(n3=i) (0<i<51)
cn(i) =cn1(i)+cn2(i)+cn3(i)
2 мар 14, 14:25    [15657246]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
Aviram
Member

Откуда:
Сообщений: 51
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)
2 мар 14, 14:27    [15657254]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
aleks2
Guest
select   sum(case when n1 = 1 then 1 else 0 end) n1count1
         , sum(case when n1 = 2 then 1 else 0 end) n1count2
         , ...
from aTable
2 мар 14, 15:48    [15657623]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
Aviram
Member

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


sum(case when n1 = 1 then 1 else 0 end) n1count1

и повторить этy строку 150 раз?

Kак сделать запрос c помощью тb2 намного крaтким?
2 мар 14, 19:16    [15658582]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Aviram
aleks2,


sum(case when n1 = 1 then 1 else 0 end) n1count1

и повторить этy строку 150 раз?

Kак сделать запрос c помощью тb2 намного крaтким?
Оформляйте тему как положено.
То надо 150 колонок, то не надо...
Ждёте, что Вам про DSQL кто-нибудь скажет?
Или про формирование запроса средствами клиента?
2 мар 14, 20:08    [15658816]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
Aviram
Member

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

Благодарю за замечание.

Tаблица тb1:

row1 int, n1 int, n2 int, n3 int.

n1, n2, n3 имеют значения от 1 до 50.
row1 - номер строчки.

Eсть таблица тb2 порядковых номеров с колонкой:
num int, от 0 до 100.

num
----
0
1
.
.
.
100

101 строчек.

желаемый результат запроса: 5 колонок, 50 строчек.

row n1Count n2Count n3Count TotalCount
-- ------- ------ ------ --------
1
2
3
.
.
.
50

n1Count (row) - к-во строчек где n1=row в таблице тb1.
0<row<51, row - номер строчки.
TotalCount(i)=n1Count(i) +n2Count(i) +n3Count(i)

надеюсь, запрос ясен.
спасибо всем заранее.
2 мар 14, 20:42    [15658952]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
Aviram
Member

Откуда:
Сообщений: 51
надо подсчитать сколько раз был 1 в колонке n1, сколько раз - 2, 3 и.т.д.
то же самое в n2, n3.
2 мар 14, 20:47    [15658966]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
declare @t1 table (n1 int, n2 int, n3 int);
declare @t2 table (n int);

insert into @t1
 (n1, n2, n3)
select top (10)
 rand(checksum(newid())) * 50 + 1,
 rand(checksum(newid())) * 50 + 1,
 rand(checksum(newid())) * 50 + 1
from
 master.dbo.spt_values;

insert into @t2
 (n)
select top (100)
 row_number() over (order by (select 1))
from
 master.dbo.spt_values;

select
 t2.n, c1.c1, c2.c2, c3.c3, c1.c1 + c2.c2 + c3.c3
from
 @t2 t2 outer apply
 (select count(*) from @t1 where n1 = t2.n) c1(c1) outer apply
 (select count(*) from @t1 where n2 = t2.n) c2(c2) outer apply
 (select count(*) from @t1 where n3 = t2.n) c3(c3)
where
 t2.n between 1 and 50;
2 мар 14, 21:08    [15659062]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Можно слегка оптимизировать
select
 t2.n, c.c1, c.c2, c.c3, c.c1 + c.c2 + c.c3
from
 @t2 t2 outer apply
 (
  select
   count(e.e1), count(e.e2), count(e.e3)
  from
   @t1 cross apply
   (select case when n1 = t2.n then 1 end, case when n2 = t2.n then 1 end, case when n3 = t2.n then 1 end) e(e1, e2, e3)
  where
   n1 = t2.n or n2 = t2.n or n3 = t2.n
 ) c(c1, c2, c3)
where
 t2.n between 1 and 50;
2 мар 14, 21:28    [15659165]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
aleks2
Guest
Что за монстры?

select 'n1' as name, n1 as n, count(*) as cnt
from aTable
group by n1
union all
select 'n2' as name, n2 as n, count(*) as cnt
from aTable
group by n2
...


Ну... ишо pivot можно потом разучить.
3 мар 14, 06:16    [15660375]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
aleks2
Guest
Вот так ишо проще
with
  n1 as ( select n1 as n, count(*) as cnt from aTable group by n1)
, n2 as ( select n2 as n, count(*) as cnt from aTable group by n2)
, n3 as ( select n2 as n, count(*) as cnt from aTable group by n2)

select coalesce(n1.n, n2.n, n2.n ) [row], isnull(n1.n, 0) n1Count, isnull(n2.n, 0) n2Count, isnull(n3.n, 0) n3Count, isnull(n1.n, 0) + isnull(n2.n, 0) + isnull(n3.n, 0) TotalCount
from n1 
     full outer join n2 on n1.n=n2.n 
     full outer join n3 on n1.n=n3.n 
3 мар 14, 06:51    [15660394]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
Aviram
Member

Откуда:
Сообщений: 51
Благодарю вас всех, дорогие друзья.

aleks2, чтобы закрыть тему, надо чуть скорректировать запрос.
по вашему запросу получается (сократил таблицу тб2).
интересно сравнить скорость запросов.

row n1Count n2Count n3Count TotalCount
0 0 0 0 0
9 9 9 9 27
3 3 3 3 9
6 6 6 6 18
7 7 7 7 21
1 1 1 1 3
4 4 4 4 12
5 5 5 5 15
2 2 2 2 6
8 8 8 8 24

Для граждан sql.ru, Запрос invm сработал.

вот упрощенный результат запроса. вместо between 1 and 50, between 0 and 9,

n c1 c2 c3 cnt
0 133 104 79 316
1 91 104 95 290
2 97 99 94 290
3 97 105 93 295
4 101 101 97 299
5 90 86 110 286
6 98 97 102 297
7 101 102 106 309
8 103 98 119 320
9 89 104 105 298
3 мар 14, 13:32    [15662459]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
aleks2
Guest
Aviram
aleks2, чтобы закрыть тему, надо чуть скорректировать запрос.
по вашему запросу получается (сократил таблицу тб2).


Извини дарагой, при дифиците мозга - медицина бессильна.
Да и не доктор я...
3 мар 14, 13:46    [15662613]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
Aviram
Member

Откуда:
Сообщений: 51
aleks2,
желаю вам отличного и благодушного настроения.
3 мар 14, 14:06    [15662788]     Ответить | Цитировать Сообщить модератору
 Re: Kак сделать Count каждого из значении 1-50 в таблице?  [new]
aleks2
Guest
Я ж говорил - медицина бессильна
declare @Table table(row1 int identity primary key clustered, n1 int, n2 int, n3 int)
declare @n int = 100

while @n > 0
begin
  insert @Table(n1, n2, n3)
    values(rand()*9, rand()*9, rand()*9);
    
  set @n = @n - 1;
end;

select * from @Table;

with
  n1 as ( select n1 as n, count(*) as cnt from @Table group by n1)
, n2 as ( select n2 as n, count(*) as cnt from @Table group by n2)
, n3 as ( select n3 as n, count(*) as cnt from @Table group by n3)
select coalesce( n1.n, n2.n, n3.n ) [row], isnull(n1.cnt, 0) n1Count, isnull(n2.cnt, 0) n2Count, isnull(n3.cnt, 0) n3Count, isnull(n1.cnt, 0) + isnull(n2.cnt, 0) + isnull(n3.cnt, 0) TotalCount
from n1 
     full outer join n2 on n1.n=n2.n 
     full outer join n3 on n1.n=n3.n 
order by coalesce( n1.n, n2.n, n3.n )
4 мар 14, 10:42    [15667733]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить