Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2397 |
AleksRous, по одному чем? почем д.б. 4/3 ?? |
21 ноя 16, 11:29 [19915086] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
AleksRous, а логику видимо надо угадать? |
21 ноя 16, 11:32 [19915106] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Вангую, подряд - считать за один. |
||
21 ноя 16, 11:34 [19915121] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
ЗЫ. Тредстартеру. Считайте не YES/NO, а изменения. Вот и фсе. |
21 ноя 16, 11:35 [19915137] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
В смысле чем ? Обще количество 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] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
а как мне это и нужно синтаксис какой и чем |
||||
21 ноя 16, 11:38 [19915165] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8493 |
AleksRous, никак не подсчитаете потому, что у вас неупорядоченная куча. |
21 ноя 16, 11:39 [19915169] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
синтаксис если не сложно , спасибо |
||
21 ноя 16, 11:41 [19915188] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
Обще количество 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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
AleksRous, STFF start_of_group grp_id |
21 ноя 16, 11:52 [19915269] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
Подробнее если можно , спасибо |
||
21 ноя 16, 11:56 [19915289] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47065 |
Ничто не поможет! |
||
21 ноя 16, 11:56 [19915291] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
А если даты добавить ? 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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
|
||
21 ноя 16, 12:15 [19915408] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
o-o, Спасибо , некоторые говорили невозможно, Respect ))) |
21 ноя 16, 13:01 [19915658] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6802 |
AleksRous, а про идиотизм вашего первоначального условия вам не говорили? |
21 ноя 16, 13:04 [19915667] Ответить | Цитировать Сообщить модератору |
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 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] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2397 |
aleks2, >>что за бред зачем вы так категоричны? даже если вариант более затраный, он требуемое 3/4 возращает, а ваш 3/3 |
21 ноя 16, 13:10 [19915703] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
1. Это зависит от "как трактовать начальный интервал". Не надо быть эйнштейном чтобы поправить. 2. Затратный (без нужды) вариант - это бред по-определению. |
||
21 ноя 16, 13:12 [19915714] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8493 |
Для первого поста это невозможно. |
||
21 ноя 16, 13:20 [19915762] Ответить | Цитировать Сообщить модератору |
AleksRous Member Откуда: Сообщений: 93 |
Да согласен нужно было более детально все описать , но после того как я детально все обьяснил тоже писали, что не возможно |
||||
21 ноя 16, 14:07 [19916097] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |