Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
Kак подсчитать , существует колонка в ней инфа такой пример :

Column
YES
YES
YES
NO
NO
NO
NO
NO
YES
YES
NO
NO
YES
NO
YES

Сколько YES и NO , но не общее количество а все по одному то есть должно быть YES - 4 , NO - 3 , count(distinct column) выдаст 2.

SQL Server 2008 R2

Заранее благодарен.
21 ноя 16, 11:18    [19914995]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2397
AleksRous,

по одному чем? почем д.б. 4/3 ??
21 ноя 16, 11:29    [19915086]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
AleksRous,

а логику видимо надо угадать?
21 ноя 16, 11:32    [19915106]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
aleks2
Guest
WarAnt
AleksRous,

а логику видимо надо угадать?


Вангую, подряд - считать за один.
21 ноя 16, 11:34    [19915121]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
aleks2
Guest
ЗЫ. Тредстартеру. Считайте не YES/NO, а изменения.
Вот и фсе.
21 ноя 16, 11:35    [19915137]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
StarikNavy
AleksRous,

по одному чем? почем д.б. 4/3 ??


В смысле чем ?


Обще количество YES = 7 , NO = 8 , но мне не нужно их обще количество , мне нужно с интервалами допустим это не YES , NO а, задолженность клиента в днях , сколько клиент был в задолженности и выходил из нее , замениv на цифры:

Column
0
0
0
1
2
3
4
5
0
0
1
2
0
1
0

практически тоже самое 3 раза выходил с задолженности , 0 = не было задолженности , >0 был
21 ноя 16, 11:37    [19915150]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

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

а логику видимо надо угадать?


Вангую, подряд - считать за один.



а как мне это и нужно синтаксис какой и чем
21 ноя 16, 11:38    [19915165]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Владислав Колосов
Member

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

никак не подсчитаете потому, что у вас неупорядоченная куча.
21 ноя 16, 11:39    [19915169]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
aleks2
ЗЫ. Тредстартеру. Считайте не YES/NO, а изменения.
Вот и фсе.


синтаксис если не сложно , спасибо
21 ноя 16, 11:41    [19915188]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 117
Я правильно понимаю, что нужно что-то типа этого?
;WITH cte ([Column])
AS
(
    SELECT 'YES' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'YES'
)
SELECT [Column], COUNT([Column])
FROM cte
GROUP BY [Column]
21 ноя 16, 11:42    [19915194]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
Sybex
Я правильно понимаю, что нужно что-то типа этого?
;WITH cte ([Column])
AS
(
    SELECT 'YES' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'YES' UNION ALL
    SELECT 'NO' UNION ALL
    SELECT 'YES'
)
SELECT [Column], COUNT([Column])
FROM cte
GROUP BY [Column]





Обще количество YES = 7 , NO = 8 , но мне не нужно их обще количество , мне нужно с интервалами допустим это не YES , NO а, задолженность клиента в днях , сколько клиент был в задолженности и выходил из нее , замениv на цифры:

Column
0
0
0
1
2
3
4
5
0
0
1
2
0
1
0

практически тоже самое 3 раза выходил с задолженности , 0 = не было задолженности , >0 был
21 ноя 16, 11:44    [19915199]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Добрый Э - Эх
Guest
AleksRous,

STFF start_of_group grp_id
21 ноя 16, 11:52    [19915269]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
Добрый Э - Эх
AleksRous,

STFF start_of_group grp_id



Подробнее если можно , спасибо
21 ноя 16, 11:56    [19915289]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
iap
Member

Откуда: Москва
Сообщений: 47065
Добрый Э - Эх
AleksRous,

STFF start_of_group grp_id
У него же не задан порядок записей!
Ничто не поможет!
21 ноя 16, 11:56    [19915291]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
iap
Добрый Э - Эх
AleksRous,

STFF start_of_group grp_id
У него же не задан порядок записей!
Ничто не поможет!


А если даты добавить ?

DATE OverdueDays
2014-12-04 0
2014-12-05 1
2014-12-08 4
2014-12-09 5
2015-01-08 0
2015-01-09 1
2015-01-12 2
2015-01-13 3
2015-01-14 4
2015-01-15 5
2015-01-16 0
2015-01-19 0
2015-02-03 0
2015-02-04 0
2015-02-05 1
2015-02-06 2
2015-08-04 0
21 ноя 16, 12:05    [19915362]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Добрый Э - Эх
Guest
AleksRous
Подробнее если можно , спасибо
Всегда пожалуйста...
21 ноя 16, 12:15    [19915408]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
declare @t table (dt date, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 

with cte as
(
  select dt, val,
    row_number() over(order by dt)
      - row_number() over(order by val, dt) as grp
  from @t cross apply (select case OverdueDays when 0 then 0 else 1 end as val)a
),

cte1 as
(
select val
from cte
group by val, grp
)

select val, count(*) as cnt
from cte1
group by val;
21 ноя 16, 12:30    [19915493]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
o-o,


Спасибо , некоторые говорили невозможно, Respect )))
21 ноя 16, 13:01    [19915658]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
AleksRous,

а про идиотизм вашего первоначального условия вам не говорили?
21 ноя 16, 13:04    [19915667]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
aleks2
Guest
o-o
declare @t table (dt date, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 

with cte as
(
  select dt, val,
    row_number() over(order by dt)
      - row_number() over(order by val, dt) as grp
  from @t cross apply (select case OverdueDays when 0 then 0 else 1 end as val)a
),

cte1 as
(
select val
from cte
group by val, grp
)

select val, count(*) as cnt
from cte1
group by val;


Что за бред?
Зачем мучить сервер бессмысленно и беспощадно?

declare @t table (dt date primary key, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 
 
select cnt = count(*), [state] = 'YES'  from @t as t where t.OverdueDays = 1
union all
select cnt = count(*), [state] = 'NO'  from @t as t cross apply (select top(1) OverdueDays from @t as tt where tt.dt < t.dt order by tt.dt desc) as x where t.OverdueDays > 0 and x.OverdueDays = 0;
21 ноя 16, 13:06    [19915678]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
StarikNavy
Member

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

>>что за бред
зачем вы так категоричны?
даже если вариант более затраный, он требуемое 3/4 возращает, а ваш 3/3
21 ноя 16, 13:10    [19915703]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
aleks2
Guest
StarikNavy
aleks2,

>>что за бред
зачем вы так категоричны?
даже если вариант более затраный, он требуемое 3/4 возращает, а ваш 3/3


1. Это зависит от "как трактовать начальный интервал". Не надо быть эйнштейном чтобы поправить.

2. Затратный (без нужды) вариант - это бред по-определению.
21 ноя 16, 13:12    [19915714]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
aleks2
Guest
declare @t table (dt date primary key, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 
 
select cnt = count(*), [state] = 'YES'  from @t as t where t.OverdueDays = 1
union all
select cnt = count(*), [state] = 'NO'  from @t as t outer apply (select top(1) OverdueDays from @t as tt where tt.dt > t.dt order by tt.dt ) as x where t.OverdueDays = 0 and isnull(x.OverdueDays, 1) = 1;
21 ноя 16, 13:19    [19915757]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8493
AleksRous
o-o,


Спасибо , некоторые говорили невозможно, Respect )))


Для первого поста это невозможно.
21 ноя 16, 13:20    [19915762]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
AleksRous
Member

Откуда:
Сообщений: 93
Владислав Колосов
AleksRous
o-o,


Спасибо , некоторые говорили невозможно, Respect )))


Для первого поста это невозможно.



Да согласен нужно было более детально все описать , но после того как я детально все обьяснил тоже писали, что не возможно
21 ноя 16, 14:07    [19916097]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить