Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
1

Свертывание и суммирование

21.03.2013, 17:04. Просмотров 1581. Ответов 21
Метки нет (Все метки)

Добрый день, уважаемые форумчане. Подскажите как правильно сделать свертывание строк и суммирование других следующий запрсос:

есть запрос, вызывающий несколько полей, первое поле А состоит из кодов, которые иногда повторяются,
поле B состоит из дат, которые для каждого повторящегося набора строк поля А всегда разные, есть поля C и D с некотороми числовыми данными.

Необходимо свернуть эту таблицу по повторяющимся строкам первого поля А так, чтобы соответствующие строки в полях C и D просуммировались, при этом поле В с датами, по которому плодятся строки с одинаковыми кодами в А, уже будет несущественно.

Сам запрос достаточно громоздкий, поэтому для примера его код не привожу. Очевидно, что тут должны как-то работать фугкции group by и count, но что-то пока не получается...

A B C D (аналогично С)
... ...
99 11.03.2013 5
100 03.03.2013 5
101 04.03.2013 2
101 07.03.2013 3
101 12.03.2013 7
104 01.03.2013 8
107 02.03.2013 0
... ...

Должно получиться

A C
... ...
99 5
100 5
101 12 ---- свернули А по 101, просуммировали С (2+3+7)
104 8
107 0
... ...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 17:04
Ответы с готовыми решениями:

Суммирование
Приветствую всех! ****Я не волшебник - я только учусь... А теперь далее... Имеется несколько...

Суммирование
У меня есть объединенная таблица (упрощенно) как на первом рисунке. Мне нужно удалить дубликаты в...

Запрос, Группировка, Суммирование
Добрый день всем!!! У меня такая задача, не могу разбираться, помогите пожалуйста: есть Table1,...

Суммирование данных по месяцам
Здравствуйте! Такой вот вопрос, как сделать суммирование данных по месяцам. В месяце данные могут...

Суммирование значений по условиям
Доброго всем дня! Подскажите, как можно подойти к реализации следующей задач : Имеется табличка...

21
pincet
1393 / 976 / 131
Регистрация: 23.07.2010
Сообщений: 5,317
21.03.2013, 17:27 2
не count - sum
0
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
21.03.2013, 17:29  [ТС] 3
sum само собой
0
pincet
1393 / 976 / 131
Регистрация: 23.07.2010
Сообщений: 5,317
21.03.2013, 18:08 4
так в чем проблема тогда?
T-SQL
1
2
select A, sum(c) from somethit
group by A
0
21.03.2013, 18:08
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
21.03.2013, 18:17  [ТС] 5
А если у меня С имет тип данных char, которые получаю из своей функции? Sum ругается на аргумент, я так уже пробовал.

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT --DISTINCT  
 
[articleCode] as [Код связки],
--day(g.ondate) as [число],
--g.Demand as [Продажи],
--forecast1 as [Прогноз1],
 
sum(TEST_SLIM4.dbo.For_condition4(@TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1) )
 
 
FROM [Slim4].[slim4].dbo.Article  
full join Axon.Slim4.dbo.DayDemand_Current    g on articleCode = g.articulCode 
WHERE Code between 900000 and 999999 and articleCode = '20665-900001' 
 
group by [articleCode]
--ORDER BY articleCode
Msg 409, Level 16, State 2, Line 118
The sum or average aggregate operation cannot take a char data type as an argument.
0
pincet
1393 / 976 / 131
Регистрация: 23.07.2010
Сообщений: 5,317
21.03.2013, 18:32 6
CAST изучай
1
kodv
1431 / 1104 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
22.03.2013, 06:54 7
T-SQL
1
2
3
SELECT A, SUM(CAST(CASE WHEN ISNUMERIC(C) THEN CAST(C AS INT) ELSE 0 END))
    FROM myTable
    GROUP BY A
1
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
22.03.2013, 09:39  [ТС] 8
Попробовал с CAST, но почему-то ругается на THEN, может дело в функции ISNUMERIC?

...
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT DISTINCT  
 
[articleCode], --sum(g.Demand),
 
--g.Demand
 
 
SUM(CAST(CASE WHEN ISNUMERIC(TEST_SLIM4.dbo.For_condition4(@TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1)) 
        THEN CAST(TEST_SLIM4.dbo.For_condition4(@TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1) AS INT) ELSE 0 END))
 
 
 
FROM [Slim4].[slim4].dbo.Article  
full join Axon.Slim4.dbo.DayDemand_Current    g on articleCode = g.articulCode 
WHERE Code between 900000 and 999999 and warehouse = '20665-' and [articleCode] = '20665-901182'
 
 
--ORDER BY [Код связки]
GROUP BY [articleCode]
--------

Msg 156, Level 15, State 1, Line 125
Incorrect syntax near the keyword 'THEN'.
0
pincet
1393 / 976 / 131
Регистрация: 23.07.2010
Сообщений: 5,317
22.03.2013, 09:50 9
У тебя 2 cast и один as
0
kodv
1431 / 1104 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
22.03.2013, 09:59 10
Lelik83, Упс, вот, что значит писать код на форуме без проверки.
T-SQL
1
2
3
SELECT A, SUM(CAST(CASE WHEN ISNUMERIC(C) = 1 THEN CAST(C AS INT) ELSE 0 END))
    FROM myTable
    GROUP BY A
Пропустил 2 символа
0
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
22.03.2013, 10:05  [ТС] 11
Цитата Сообщение от kodv Посмотреть сообщение
Lelik83, Упс, вот, что значит писать код на форуме без проверки.
T-SQL
1
2
3
SELECT A, SUM(CAST(CASE WHEN ISNUMERIC(C) = 1 THEN CAST(C AS INT) ELSE 0 END))
    FROM myTable
    GROUP BY A
Пропустил 2 символа
Вроде pincet прав, два CAST, а AS один...

тут наверное надо так

T-SQL
1
2
3
SELECT A, SUM(CAST(CASE WHEN ISNUMERIC(C) = 1 THEN CAST(C AS INT) ELSE 0 END  AS INT))
    FROM myTable
    GROUP BY A
0
iap
935 / 650 / 141
Регистрация: 27.11.2009
Сообщений: 1,952
22.03.2013, 10:09 12
Цитата Сообщение от kodv Посмотреть сообщение
Lelik83, Упс, вот, что значит писать код на форуме без проверки.
T-SQL
1
2
3
SELECT A, SUM(CAST(CASE WHEN ISNUMERIC(C) = 1 THEN CAST(C AS INT) ELSE 0 END))
    FROM myTable
    GROUP BY A
Пропустил 2 символа
Как думаете, '32.65E-05' можно преобразовать сразу в INT?
А между тем, ISNUMERIC() вернёт 1.
Или вот ещё примерчик:
T-SQL
1
SELECT ISNUMERIC(',')
1
kodv
1431 / 1104 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
22.03.2013, 10:09 13
Lelik83, Там не нужен первый CAST, еще один мой косяк
T-SQL
1
2
3
SELECT A, SUM(CASE WHEN ISNUMERIC(C) = 1 THEN CAST(C AS INT) ELSE 0 END)
    FROM myTable
    GROUP BY A
0
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
22.03.2013, 11:19  [ТС] 14
Спасибо, вроде заработало. Возник еще один вопрос, может подскажете...

У меня есть основной запрос, код которого в силу громоздкости не привожу, есть "подзапрос", с которым вы мне помогли и который выводит 3 столбца. Как из этого столбца мне вычленить два последних и добавить в основной запрос, в котором ключом является такой же столбец с кодами? Наверное надо как-то делать подзапрос.
Попробовал просто добавить, но тогда в group by надо прописывать все необходимые мне столбцы, вычисление многих из которых достаточно громоздкое...

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT DISTINCT  
 
[articleCode] as [Код связки], 
 
isnull(sum(g.Demand), 0) as [Текущие продажи не включая посл. день],
 
SUM(CASE WHEN ISNUMERIC(TEST_SLIM4.dbo.For_condition4(@TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1)) = 1 
        THEN CAST(TEST_SLIM4.dbo.For_condition4(@TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1) AS INT) ELSE 0 END) 
 
FROM [Slim4].[slim4].dbo.Article  
full join Axon.Slim4.dbo.DayDemand_Current    g on articleCode = g.articulCode 
WHERE Code between 900000 and 999999 and warehouse = '20665-' --and [articleCode] = '20665-901182'
 
GROUP BY [articleCode]
ORDER BY [articleCode]
0
kodv
1431 / 1104 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
22.03.2013, 11:31 15
Lelik83, Не до конца понял, что именно вы хотите. У вас ваш мегазпрос по такой схеме построен?
T-SQL
1
2
3
4
5
SELECT [Список полей]
    FROM [Таблица, возможно, с кучей Join-ов]
        [Какой то, который вам нужен] JOIN [Подзапрос] AS [Альяс подзапроса]
            ON [Альяс подзапроса].[Код связки] = [Таблица, к которой join-ится подзапрос].[поле, к которому join-ится подзапрос]
    GROUP BY [Список полей], [Альяс подзапроса].[Поле для группировки]
0
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
22.03.2013, 11:41  [ТС] 16
Грубо говоря, мне надо добавить в мой запрос, код которого привел выше, еще кучу полей, многи из которых весьма громоздки. Тогда в этом случае все эти громоздкие поля необходимо поочередно перечислять в group by моего кода. Следовательно код очень сильно раздуется... Вот как бы мне избежать этого...

Наверное самый дурацкий вопрос Вот почему, названия полей можно использовать в команде ORDER BY,но нельзя использовать в GROUP BY
То есть, например

T-SQL
1
2
3
4
5
6
7
8
select
A as [код связски],
B as [что-то еще],
С as [еще что-то еще],
...
from ... where ...
group by A, B, C ...
order by [код связски], [что-то еще], [еще что-то еще],  ...
A, B, C - вычисления полей, которые могут быть очень громоздкими, а их названия - 1-2 слова

Могу писать group by A, B, C ... но не могу писать group by [код связски], [что-то еще], [еще что-то еще], ...


Надеюсь, вы меня поняли
0
kodv
1431 / 1104 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
22.03.2013, 11:49 17
Цитата Сообщение от Lelik83 Посмотреть сообщение
Вот почему, названия полей можно использовать в команде ORDER BY,но нельзя использовать в GROUP BY
Посмотрите у меня в профиле сообщения с моими благодарностями

То есть, у вас запроса еще нет. Тогда попробуйте его организовать по схеме, которую я привел выше, то есть, прицепить ваш подзапрос к вашему запросу через JOIN.
0
cygapb-007
1309 / 941 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
22.03.2013, 11:51 18
Чтобы функция не вычислялась 2 раза для каждой строки - ее лучше поместить в CROSS APPLY (если уж избавиться от вызова функции не получается):
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT DISTINCT  
[articleCode], --sum(g.Demand),
--g.Demand
SUM(CASE WHEN ISNUMERIC(myFinctionRez)=1 THEN CAST(myFinctionRez AS INT) ELSE 0 END)
FROM [Slim4].[slim4].dbo.Article  
full join Axon.Slim4.dbo.DayDemand_Current    g on articleCode = g.articulCode 
CROSS APPLY(SELECT myFinctionRez=TEST_SLIM4.dbo.For_condition4(
   @TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1)
   )crsapp
WHERE Code between 900000 and 999999 and warehouse = '20665-' 
   and [articleCode] = '20665-901182'
--ORDER BY [Код связки]
GROUP BY [articleCode]
То же самое касается полей группировки:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
select
[код связски],
[что-то еще],
[еще что-то еще],
...
from ... 
cross apply(select A as [код связски])crsapp1
cross apply(select B as [что-то еще])crsapp2
cross apply(select С as [еще что-то еще])crsapp3
where ...
group by [код связски], [что-то еще], [еще что-то еще],  ...
order by [код связски], [что-то еще], [еще что-то еще],  ...
1
kodv
1431 / 1104 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
22.03.2013, 11:52 19
iap, Согласен с вашими замечаниями, но изначально у Lelik83, хранятся в базе простые числа, но почему то строковом поле. Для данного случая, я думаю, это допустимо, даже можно было CAST без ISNUMERIC использовать.
0
Lelik83
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 235
22.03.2013, 11:55  [ТС] 20
Запрос уже, есть, просто появилась необходимость его доработать.

То есть мне в любом случае придется два раза перечислять все поля? Первый раз в теле select, второй в group by

Тогда код будет очень здоровым
0
22.03.2013, 11:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 11:55

Простенький вопросик, выборочное суммирование
Проблема такая, есть таблица с полями Цена (числа)и Оплата(логический да-нет), нужно просуммировать...

Суммирование значений из разных таблиц
Нужна помощь! Есть несколько таблиц Нужно написать функцию, которая будет вычислять стоимость...

суммирование 2ух полей.ЗАПРОС
ребят вот смотрите есть 2 поля русский и математика из таблицы оценки, как создать новое поле с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru