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

Откуда:
Сообщений: 5
Подскажите.

есть таблица с полем real в нем данные:
0
0
-1395.01
-1500.01
-1500.01
-1500.01
-117.917
0
0
0
0
-1352.919
-1500.003
-1500.003
-1500.003
-45.417
0
0
0

Как можно сгруппировать и сложить числа там где нет нуля?
17 апр 14, 19:07    [15897918]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
select sum(myfield) from mytable
17 апр 14, 19:12    [15897941]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Кот Матроскин
Member

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

А почему бы не сложить все числа? Вы считаете, прибавление нулей сильно повлияет на сумму, она станет некошерной? :)
17 апр 14, 19:18    [15897960]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Alkash45
Member

Откуда:
Сообщений: 5
сорри совсем забыл написать главное надо сгуппировать по группам от нуля до нуля
17 апр 14, 19:35    [15898001]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
igr_ok
Member

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

Для группировки нужно, как минимум, 2 столбца
17 апр 14, 21:15    [15898318]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
Alkash45
сорри совсем забыл написать главное надо сгуппировать по группам от нуля до нуля

Картинка с другого сайта.
18 апр 14, 09:10    [15899380]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Alkash45
Member

Откуда:
Сообщений: 5
Кавказ-сила,

Там две группы чисел которые не нули. Вопрос в том как сложить по этим группам. Те в выборке должны появится две суммы
18 апр 14, 09:19    [15899421]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alkash45
Кавказ-сила,

Там две группы чисел которые не нули. Вопрос в том как сложить по этим группам. Те в выборке должны появится две суммы
По какому принципу расставлены нули?
18 апр 14, 09:22    [15899430]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
aleks2
Guest
Alkash45
Кавказ-сила,

Там две группы чисел которые не нули. Вопрос в том как сложить по этим группам. Те в выборке должны появится две суммы

В выборке SQL не существует предопределенного порядка.
Нужен столбец для упорядочения.
18 апр 14, 09:23    [15899432]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Alkash45
Member

Откуда:
Сообщений: 5
Нули расставлены без принципа. Дополнительные поля все одинаковы, кроме ID конечно. Я так понимаю на чистом SQL этого не сделать? придется процедуру писать :(
18 апр 14, 09:42    [15899513]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alkash45
Нули расставлены без принципа. Дополнительные поля все одинаковы, кроме ID конечно. Я так понимаю на чистом SQL этого не сделать? придется процедуру писать :(
В SQL каждая таблица должна иметь PRIMARY KEY,
чтобы можно было обратиться к любой заданной строке.
Правда, разрешается PK не делать, но за это надо выводить во двор и расстреливать.

Может, всё-таки, есть поле со временем?

Если нули расставлены без принципа, то зачем они нужны?
18 апр 14, 09:47    [15899535]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
kalimba
Member

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

Вы результат для ваших исходных данных приведите, а то у всех после прочтения возникают мысли как на картинке.
18 апр 14, 09:49    [15899543]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Alkash45
Member

Откуда:
Сообщений: 5
Данные такие:
+
Data Tank Value
2/20/2014 12:00:00 AM T1001A 0
2/20/2014 1:00:00 AM T1001A 0
2/20/2014 2:00:00 AM T1001A -1395.01
2/20/2014 3:00:00 AM T1001A -1500.01
2/20/2014 4:00:00 AM T1001A -1500.01
2/20/2014 5:00:00 AM T1001A -1500.01
2/20/2014 6:00:00 AM T1001A -1500.01
2/20/2014 7:00:00 AM T1001A -1500.01
2/20/2014 8:00:00 AM T1001A -117.917
2/20/2014 9:00:00 AM T1001A 0
2/20/2014 10:00:00 AM T1001A 0
2/20/2014 11:00:00 AM T1001A 0
2/20/2014 12:00:00 PM T1001A 0
2/20/2014 1:00:00 PM T1001A 0
2/20/2014 2:00:00 PM T1001A 0
2/20/2014 3:00:00 PM T1001A 0
2/20/2014 4:00:00 PM T1001A 0
2/20/2014 5:00:00 PM T1001A 0
2/20/2014 6:00:00 PM T1001A 0
2/20/2014 7:00:00 PM T1001A 0
2/20/2014 8:00:00 PM T1001A 0
2/20/2014 9:00:00 PM T1001A 0
2/20/2014 10:00:00 PM T1001A 0
2/20/2014 11:00:00 PM T1001A 0
2/21/2014 12:00:00 AM T1001A 0
2/21/2014 1:00:00 AM T1001A 0
2/21/2014 2:00:00 AM T1001A 0
2/21/2014 3:00:00 AM T1001A 0
2/21/2014 4:00:00 AM T1001A 0
2/21/2014 5:00:00 AM T1001A 0
2/21/2014 6:00:00 AM T1001A 0
2/21/2014 7:00:00 AM T1001A 0
2/21/2014 8:00:00 AM T1001A 0
2/21/2014 9:00:00 AM T1001A 0
2/21/2014 10:00:00 AM T1001A 0
2/21/2014 11:00:00 AM T1001A 0
2/21/2014 12:00:00 PM T1001A 0
2/21/2014 1:00:00 PM T1001A 0
2/21/2014 2:00:00 PM T1001A 0
2/21/2014 3:00:00 PM T1001A 0
2/21/2014 4:00:00 PM T1001A 0
2/21/2014 5:00:00 PM T1001A 0
2/21/2014 6:00:00 PM T1001A 0
2/21/2014 7:00:00 PM T1001A 0
2/21/2014 8:00:00 PM T1001A 0
2/21/2014 9:00:00 PM T1001A 0
2/21/2014 10:00:00 PM T1001A 0
2/21/2014 11:00:00 PM T1001A 0
2/22/2014 12:00:00 AM T1001A 0
2/22/2014 1:00:00 AM T1001A 0
2/22/2014 2:00:00 AM T1001A 0
2/22/2014 3:00:00 AM T1001A 0
2/22/2014 4:00:00 AM T1001A 0
2/22/2014 5:00:00 AM T1001A 0
2/22/2014 6:00:00 AM T1001A 0
2/22/2014 7:00:00 AM T1001A 0
2/22/2014 8:00:00 AM T1001A 0
2/22/2014 9:00:00 AM T1001A 0
2/22/2014 10:00:00 AM T1001A 0
2/22/2014 11:00:00 AM T1001A 0
2/22/2014 12:00:00 PM T1001A 0
2/22/2014 1:00:00 PM T1001A 0
2/22/2014 2:00:00 PM T1001A 0
2/22/2014 3:00:00 PM T1001A 0
2/22/2014 4:00:00 PM T1001A 0
2/22/2014 5:00:00 PM T1001A 0
2/22/2014 6:00:00 PM T1001A 0
2/22/2014 7:00:00 PM T1001A 0
2/22/2014 8:00:00 PM T1001A 0
2/22/2014 9:00:00 PM T1001A 0
2/22/2014 10:00:00 PM T1001A 0
2/22/2014 11:00:00 PM T1001A 0
2/23/2014 12:00:00 AM T1001A 0
2/23/2014 1:00:00 AM T1001A 0
2/23/2014 2:00:00 AM T1001A 0
2/23/2014 3:00:00 AM T1001A 0
2/23/2014 4:00:00 AM T1001A 0
2/23/2014 5:00:00 AM T1001A 0
2/23/2014 6:00:00 AM T1001A 0
2/23/2014 7:00:00 AM T1001A 0
2/23/2014 8:00:00 AM T1001A -1352.919
2/23/2014 9:00:00 AM T1001A -1500.003
2/23/2014 10:00:00 AM T1001A -1500.003
2/23/2014 11:00:00 AM T1001A -1500.003
2/23/2014 12:00:00 PM T1001A -1500.003
2/23/2014 1:00:00 PM T1001A -1500.003
2/23/2014 2:00:00 PM T1001A -1500.003
2/23/2014 3:00:00 PM T1001A -1500.003
2/23/2014 4:00:00 PM T1001A -1500.003
2/23/2014 5:00:00 PM T1001A -1500.003
2/23/2014 6:00:00 PM T1001A -1500.003
2/23/2014 7:00:00 PM T1001A -1500.003
2/23/2014 8:00:00 PM T1001A -1500.003
2/23/2014 9:00:00 PM T1001A -1500.003
2/23/2014 10:00:00 PM T1001A -1500.003
2/23/2014 11:00:00 PM T1001A -1500.003
2/24/2014 12:00:00 AM T1001A -1500.003
2/24/2014 1:00:00 AM T1001A -1500.003
2/24/2014 2:00:00 AM T1001A -1500.003
2/24/2014 3:00:00 AM T1001A -1500.003
2/24/2014 4:00:00 AM T1001A -1500.003
2/24/2014 5:00:00 AM T1001A -1500.003
2/24/2014 6:00:00 AM T1001A -1500.003
2/24/2014 7:00:00 AM T1001A -1500.003
2/24/2014 8:00:00 AM T1001A -1500.003
2/24/2014 9:00:00 AM T1001A -1500.003
2/24/2014 10:00:00 AM T1001A -1500.003
2/24/2014 11:00:00 AM T1001A -1500.003
2/24/2014 12:00:00 PM T1001A -1500.003
2/24/2014 1:00:00 PM T1001A -1500.003
2/24/2014 2:00:00 PM T1001A -1500.003
2/24/2014 3:00:00 PM T1001A -1500.003
2/24/2014 4:00:00 PM T1001A -1500.003
2/24/2014 5:00:00 PM T1001A -1500.003
2/24/2014 6:00:00 PM T1001A -1500.003
2/24/2014 7:00:00 PM T1001A -45.417
2/24/2014 8:00:00 PM T1001A 0
2/24/2014 9:00:00 PM T1001A 0
2/24/2014 10:00:00 PM T1001A 0
2/24/2014 11:00:00 PM T1001A 0
2/25/2014 12:00:00 AM T1001A 0
2/25/2014 1:00:00 AM T1001A 0
2/25/2014 2:00:00 AM T1001A 0
2/25/2014 3:00:00 AM T1001A 0
2/25/2014 4:00:00 AM T1001A 0
2/25/2014 5:00:00 AM T1001A 0
2/25/2014 6:00:00 AM T1001A 0
2/25/2014 7:00:00 AM T1001A 0
2/25/2014 8:00:00 AM T1001A 0
2/25/2014 9:00:00 AM T1001A 0
2/25/2014 10:00:00 AM T1001A 0
2/25/2014 11:00:00 AM T1001A 0
2/25/2014 12:00:00 PM T1001A 0
2/25/2014 1:00:00 PM T1001A 0


В итого надо получить дату начала и конца и сумму по Value между нулями

Модератор: Впредь убирайте портянки под тег spoiler


Сообщение было отредактировано: 18 апр 14, 13:20
18 апр 14, 09:58    [15899586]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
iap
Member

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

напишите, пожалуйста, CREATE TABLE и INSERT в эту таблицу показанных Вами данных. Всё в теге SRC.
И версию сервера назовите.
18 апр 14, 10:08    [15899637]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Добрый Э - Эх
Guest
Alkash45,

ищи по словам "инвариант группы", "разность двух разнооконных row_number-ов"
18 апр 14, 10:29    [15899732]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
sqluserfromhell
Member

Откуда:
Сообщений: 864
with intervals as (
select min(t1.Data) as begindate, max(t1.data) enddate from [dbo].[Table_1] t
inner join [dbo].[Table_1] t1 on t1.Data >= t.Data and t1.Value != 0
left join [dbo].[Table_1] t2 on t2.Data > t.Data and t2.Data < t1.data and t2.Value = 0
left join [dbo].[Table_1] t3 on t3.Data < t.Data
where t2.Data is null and (t.Value = 0 or t3.Data is null)
group by t.Data
)
select i.begindate, i.enddate, sum(t.Value) as valuesum  from intervals i inner join [dbo].[Table_1] t on
t.Data >= i.begindate and t.Data <= i.enddate 
group by i.begindate, i.enddate
18 апр 14, 11:45    [15900261]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
sqluserfromhell
Member

Откуда:
Сообщений: 864
или так
with table_1 as (
select data, value from [dbo].[Table_1]
union all 
select cast('01-01-1800' as datetime),  0
),
intervals as (
select min(t1.Data) as begindate, max(t1.data) enddate from table_1 t
inner join [dbo].[Table_1] t1 on t1.Data >= t.Data and t1.Value != 0
left join [dbo].[Table_1] t2 on t2.Data > t.Data and t2.Data < t1.data and t2.Value = 0
where t2.Data is null and (t.Value = 0)
group by t.Data
)
select i.begindate, i.enddate, sum(t.Value) as valuesum  from intervals i inner join table_1 t on
t.Data >= i.begindate and t.Data <= i.enddate 
group by i.begindate, i.enddate;
18 апр 14, 12:28    [15900540]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Добрый Э - Эх
Guest
sqluserfromhell,

как минимум - не учтено разбиение данных по "танкам", а оно , скорее всего, требуется.
про остальное - без комментариев.
18 апр 14, 12:39    [15900614]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
sqluserfromhell
Member

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

как минимум - не учтено разбиение данных по "танкам", а оно , скорее всего, требуется.
про остальное - без комментариев.

Есть задача, есть решение про танки только Ваши догадки.
и остальное прокомментируйте и предложите свое более грамотное решение)
18 апр 14, 12:42    [15900634]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Добрый Э - Эх
Guest
sqluserfromhell,

исключительно в целях твоего "повышения уровня образованности":
select tank, min(data) as start_data, max(data) as end_data, sum(Value) as sun_value
  from (
         select t.*
              , row_number() over(partition by tank, case Value when 0 then 0 else 1 end order by data) - 
                row_number() over(partition by tank order by data) as grp_id
          from t
       ) v
 where Value != 0
 group by tank, grp_id
18 апр 14, 12:43    [15900643]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
sqluserfromhell
Member

Откуда:
Сообщений: 864
можно и так)
with table_1 as (
select data, value from [dbo].[Table_1]
union all 
select cast('01-01-1800' as datetime),  0
)
select min(t1.Data) as begindate, max(t1.data) enddate, sum(t1.Value) from table_1 t
inner join [dbo].[Table_1] t1 on t1.Data >= t.Data and t1.Value != 0
left join [dbo].[Table_1] t2 on t2.Data > t.Data and t2.Data < t1.data and t2.Value = 0
where t2.Data is null and (t.Value = 0)
group by t.Data
18 апр 14, 12:44    [15900651]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
sqluserfromhell
Member

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

исключительно в целях твоего "повышения уровня образованности":
select tank, min(data) as start_data, max(data) as end_data, sum(Value) as sun_value
  from (
         select t.*
              , row_number() over(partition by tank, case Value when 0 then 0 else 1 end order by data) - 
                row_number() over(partition by tank order by data) as grp_id
          from t
       ) v
 where Value != 0
 group by tank, grp_id

поздравляю, подключили функции партиционирования. мой вариант более универсальный.
18 апр 14, 12:55    [15900713]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
Добрый Э - Эх
Guest
sqluserfromhell
поздравляю, подключили функции партиционирования.
Впервые слышу такой странный "слэнг". Уж как только не называли оконные функции, но вот так ещё не слышал.

sqluserfromhell
мой вариант более универсальный.
чем докажешь?
18 апр 14, 13:01    [15900743]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
sqluserfromhell
Member

Откуда:
Сообщений: 864
Добрый Э - Эх
sqluserfromhell
поздравляю, подключили функции партиционирования.
Впервые слышу такой странный "слэнг". Уж как только не называли оконные функции, но вот так ещё не слышал.

sqluserfromhell
мой вариант более универсальный.
чем докажешь?

- я про то что мой вариант без with будет работать везде, твой только в msSQL.
- молодец ты выделил группы за счет оконных функций , я их выделил за счет джойнов и не стал ломать себе мозг.
18 апр 14, 13:05    [15900774]     Ответить | Цитировать Сообщить модератору
 Re: группировка и суммирование  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
sqluserfromhell
- я про то что мой вариант без with будет работать везде
Ну уж и везде!
"!=" - это нестандартная запись оператора.
Стандарт требует "<>"
18 апр 14, 13:14    [15900844]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить