Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238

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

21.03.2013, 17:04. Показов 4811. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2013, 17:04
Ответы с готовыми решениями:

Свёртывание ссылок
template<typename TPara> void f(TPara&& p){} Если передать функции f lvalue (int)или ссылку на lvalue,то в обоих случаях...

Свёртывание функций
Здравствуйте! Посоветовали обратиться на форум. Есть две функции f и g, которые при взаимодействии друг с другом порождают третью...

Свертывание в область уведомлений
Добрый день! Пытаюсь реализовать свертывание приложения в область уведомлений. Очень долго гуглил, но рабочего решения так и не нашел....

21
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
21.03.2013, 17:27
не count - sum
0
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
21.03.2013, 17:29  [ТС]
sum само собой
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
21.03.2013, 18:08
так в чем проблема тогда?
T-SQL
1
2
select A, sum(c) from somethit
group by A
0
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
21.03.2013, 18:17  [ТС]
А если у меня С имет тип данных 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
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
21.03.2013, 18:32
CAST изучай
1
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
22.03.2013, 06:54
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
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
22.03.2013, 09:39  [ТС]
Попробовал с 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
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
22.03.2013, 09:50
У тебя 2 cast и один as
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
22.03.2013, 09:59
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
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
22.03.2013, 10:05  [ТС]
Цитата Сообщение от 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
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
22.03.2013, 10:09
Цитата Сообщение от 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
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
22.03.2013, 10:09
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
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
22.03.2013, 11:19  [ТС]
Спасибо, вроде заработало. Возник еще один вопрос, может подскажете...

У меня есть основной запрос, код которого в силу громоздкости не привожу, есть "подзапрос", с которым вы мне помогли и который выводит 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
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
22.03.2013, 11:31
Lelik83, Не до конца понял, что именно вы хотите. У вас ваш мегазпрос по такой схеме построен?
T-SQL
1
2
3
4
5
SELECT [Список полей]
    FROM [Таблица, возможно, с кучей Join-ов]
        [Какой то, который вам нужен] JOIN [Подзапрос] AS [Альяс подзапроса]
            ON [Альяс подзапроса].[Код связки] = [Таблица, к которой join-ится подзапрос].[поле, к которому join-ится подзапрос]
    GROUP BY [Список полей], [Альяс подзапроса].[Поле для группировки]
0
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
22.03.2013, 11:41  [ТС]
Грубо говоря, мне надо добавить в мой запрос, код которого привел выше, еще кучу полей, многи из которых весьма громоздки. Тогда в этом случае все эти громоздкие поля необходимо поочередно перечислять в 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
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
22.03.2013, 11:49
Цитата Сообщение от Lelik83 Посмотреть сообщение
Вот почему, названия полей можно использовать в команде ORDER BY,но нельзя использовать в GROUP BY
Посмотрите у меня в профиле сообщения с моими благодарностями

То есть, у вас запроса еще нет. Тогда попробуйте его организовать по схеме, которую я привел выше, то есть, прицепить ваш подзапрос к вашему запросу через JOIN.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
22.03.2013, 11:51
Чтобы функция не вычислялась 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
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
22.03.2013, 11:52
iap, Согласен с вашими замечаниями, но изначально у Lelik83, хранятся в базе простые числа, но почему то строковом поле. Для данного случая, я думаю, это допустимо, даже можно было CAST без ISNUMERIC использовать.
0
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
22.03.2013, 11:55  [ТС]
Запрос уже, есть, просто появилась необходимость его доработать.

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

Тогда код будет очень здоровым
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2013, 11:55
Помогаю со студенческими работами здесь

Свёртывание окна в трей
Всем привет! Такая проблема: Сделал метод свёртывания окна в трей, всё вроде работает, значёк в трее появляется, но вся проблема в том,...

Свертывание кодов HELP_ME!!!
Подскажите пожалуйста, кто знает такую поисковую стратегию, как способ свертывания кодов. у меня курсовая на тему Сравнительный анализ...

Свертывание и развертывание формы
подскажите как работает кнопка свертывания и развертывания окна та которая рядом с кнопкой закрыть окно рисунок у нее два квадратика ...

Как добавить свертывание к группам
Как добавить свертывание к группам? Procedure StringToUnicode(pbstrptr.l, ucstrptr.l) MultiByteToWideChar_ (#CP_ACP, 0, pbstrptr,...

Как заблокировать свертывание формы?
Доброго времени суток. Я использую Windows Forms и язык C# для написания не большого проекта. Основным элементом Формы является...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru