Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
4 / 4 / 0
Регистрация: 09.01.2014
Сообщений: 130

Выборка из 1 таблицы суммы значений, удовлетворяющие условиям

16.02.2015, 20:35. Показов 3960. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане.
Весь день ломал голову, но так и не победил.
Суть вопроса такова:
возьмем 4 поля таблицы - 0. Название орг-ии 1. ИНН 2. Сумма 3. Счет
0. Ааа 1. 111 2. 100 3. 111111
0. Ббб 1. 222 2. 200 3. 222222
0. Ввв 1. 333 2. 300 3. 333333
0. Ббб 1. 222 2. 200 3. 111111
0. Ввв 1. 333 2. 300 3. 111111
В результате выборки надо получить:
0. Ааа 1. 111 зачислил на 0 счетов
0. Ббб 1. 222 зачислил на 1 счет
0. Ввв 1. 333 зачислил на 2 счета
Логика такая:
Нужно посчитать кол-во счетов на которые перечислила конкретная организация (ИНН), с условием, что если на один и тот же счет зачисляли 2 (или более) организации, то считать это кол-во в организацию с наибольшим зачислением.
До 21:00 бился на работе с этим вопросом, но так и не осилил. Кол-во счетов не трудно посчитать было, а вот наложить туда еще это условие - увы не смог.
Надеюсь понятно изъяснился. Если будут вопросы - готов ответить.
Очень надеюсь на вашу помощь.
Заранее спасибо.
С уважением, Александр.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2015, 20:35
Ответы с готовыми решениями:

Выборка из таблицы по двум условиям
Уважаемые эксперты! Прошу помощи с небольшой задачей в Excel: Имеется 2 выпадающих меню с условиями: Сектор предприятия (нефть...

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

Выборка из таблицы по нескольким условиям MS Excel
Уважаемые эксперты, подскажите пожалуйста как сделать в данном случае. Есть 4 критерия - 4 столбца данных, я их вырезал отдельно из...

16
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
16.02.2015, 22:49
alexandrstegnin, вообще схема таблицы странная, должна быть :id, idфирмы, счет, сумма.
ну да ладно

T-SQL
1
2
3
4
5
6
7
8
SELECT o.name, o.inn, COUNT(x.account)
FROM orgTest o LEFT JOIN 
    (SELECT account, MAX([sum]) AS maxsum, 
        (SELECT TOP(1) inn FROM orgTest WHERE o.account= account AND [sum] = MAX(o.[sum])) AS maxinn
    FROM orgTest AS o 
    GROUP BY account) x 
ON x.maxinn =o.inn AND x.account = o.account
GROUP BY o.inn, o.name
Добавлено через 1 минуту
ну в таком случае если у двух фирм будет одна и та-же сумма на один и тот же счет. запрос выберет любую из этих фирм, вам нужно это обдумать
1
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
16.02.2015, 23:27
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with a as
(
 select
  t.Название, t.ИНН,
  sum(t.Сумма) over (partition by t.Счет) as Сумма,
  row_number() over (partition by t.Счет order by t.Сумма desc) as rn
 from
  Таблица t
)
select
 a.Название, a.ИНН, a.Сумма
from
 a
where
 a.rn = 1;
1
4 / 4 / 0
Регистрация: 09.01.2014
Сообщений: 130
17.02.2015, 06:43  [ТС]
To Metall_Version, полностью солидарен с Вами, но приходится работать с тем, что дают... Не моя таблица... Запрос отработал, но почему-то не верно считает... Не затруднит Вас прокомментировать, что происходит в этом случае (Ваш код). В частности то, что мы присвоили maxsum, но нигде не использовали и присвоили "о" два раза таблицы.
Заранее спасибо.
To invm, я думал, что некоторые навыки t-sql у меня всё же есть, оказывается далеко не базовые, а еще меньше. Ваш код у меня спотыкается на with, пишет "Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon". К сожалению навыков, чтобы самому разобраться в этом у меня не хватает. Если подскажете, что не так, буду признателен. Спасибо.
С уважением, Александр.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
17.02.2015, 08:39
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon
тебе ж явно сервер сказал - кляуза with должна начинаться с ";" если она не первая в пакете
1
4 / 4 / 0
Регистрация: 09.01.2014
Сообщений: 130
17.02.2015, 09:21  [ТС]
Цитата Сообщение от pincet Посмотреть сообщение
тебе ж явно сервер сказал - кляуза with должна начинаться с ";" если она не первая в пакете
Спасибо, pincet, за проявленный интерес к моей теме. Действительно так и есть. В таком случае вопрос:
По запросу от invm, он выдал мне список, в котором орг-ия, ИНН и максимальная сумма зачисления, но мне нужно немного другое, а именно по каждому ИНН количество перечислений с максимальной суммой по счету.
Если запустить такой запрос:
T-SQL
1
2
Select T1.schet, max(t1.summa) from test t1
Group by t1.schet
Он построит выборку в которой есть счет и максимальная сумма зачисления. Вопрос как теперь соединить это с ИНН?
Т.е. получить именно count...
Спасибо, что не остаетесь безучастными.
С уважением, Александр.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 11:15
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
Он построит выборку в которой есть счет и максимальная сумма зачисления. Вопрос как теперь соединить это с ИНН?
вот это я и сделал в запросе

C#
1
2
3
4
5
6
7
8
9
10
SELECT o.name, o.inn, COUNT(x.account)
FROM orgTest o LEFT JOIN 
 
    (SELECT account, 
        (SELECT TOP(1) inn FROM orgTest WHERE o.account= account AND [sum] = MAX(o.[sum])) AS maxinn
    FROM orgTest AS o 
    GROUP BY account) x  -- группируем записи по счету, выбираем сам счет(account), и ИНН фирмы, у которой зачисление на этот счет самое большое (в случае если таких фирм несколько выберется случайная)
 
ON x.maxinn =o.inn AND x.account = o.account
GROUP BY o.inn, o.name
полученный запрос х мы объединяем с таблицей фирм, и группируем фирмы по инн и имени. и для каждой фирмы находим количество сделок из запроса х

Добавлено через 25 секунд
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
но почему-то не верно считает
на каких данных ?

Добавлено через 1 минуту
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
В частности то, что мы присвоили maxsum, но нигде не использовали и присвоили "о" два раза таблицы.
maxsum было излишне, а насчет "о" просто так по привычке первую букву таблицы использую, области ихние не пересекаются
1
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
17.02.2015, 11:21
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
Логика такая:
Нужно посчитать кол-во счетов на которые перечислила конкретная организация (ИНН), с условием, что если на один и тот же счет зачисляли 2 (или более) организации, то считать это кол-во в организацию с наибольшим зачислением.
T-SQL
1
2
3
4
5
6
7
select
 a.Название, a.ИНН, count(distinct t.Счет)
from
 Таблица t cross apply
 (select top (1) Название, ИНН from Таблица where Счет = t.Счет order by Сумма desc) a
group by
 a.Название, a.ИНН;
1
4 / 4 / 0
Регистрация: 09.01.2014
Сообщений: 130
17.02.2015, 11:24  [ТС]
Metall_Version, я беру уже свои реальные данные, вернее те, которые мне предоставили. Сейчас попробую разобраться, может и в данных какой косяк закрался. Попробую сделать на тестовой и тогда будет видно думаю...
PS. Почему "select top(1) inn"?
Спасибо.
С уважением, Александр.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
17.02.2015, 11:32
вообще для top(1) нужно явно указывать порядок сортировки. Иначе какой смысл?
1
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 11:44
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
PS. Почему "select top(1) inn"?
потому что что нужно выбрать одну фирму. из всех которые зачислили максимум средств на один счет
1
4 / 4 / 0
Регистрация: 09.01.2014
Сообщений: 130
17.02.2015, 11:55  [ТС]
invm, к сожалению на 80000 записей Ваш запрос выполнялся 22 минуты, но увы, так и не увенчался успехом.
С удовольствием попробую еще идеи, а пока попробую просмотреть записи на "правильность"...
С уважением, Александр.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 12:07
alexandrstegnin, вы на главное не ответили, что если для одного счета несколько фирм имеют максимальные зачисления. какую тогда выбирать? я думаю от сюда и выползает то что вы называете "неправильность".

Добавлено через 49 секунд
на счет производительности, с такой "транной" схемой Бд это ожидаемо, плюс не помешает сделать верную индексацию.
1
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
17.02.2015, 12:17
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
invm, к сожалению на 80000 записей Ваш запрос выполнялся 22 минуты, но увы, так и не увенчался успехом.
Сделайте индекс по (Счет, Сумма desc)
0
4 / 4 / 0
Регистрация: 09.01.2014
Сообщений: 130
17.02.2015, 12:22  [ТС]
Цитата Сообщение от Metall_Version Посмотреть сообщение
alexandrstegnin, вы на главное не ответили, что если для одного счета несколько фирм имеют максимальные зачисления. какую тогда выбирать? я думаю от сюда и выползает то что вы называете "неправильность".

Добавлено через 49 секунд
на счет производительности, с такой "транной" схемой Бд это ожидаемо, плюс не помешает сделать верную индексацию.
Metall_Version, к вопросу о 2 фирмах с одинаковым зачислением - брать фирму, которая в списке попалась первой.
Погрешность в несколько счетов для данной аналитики не критична.
Еще раз соглашусь с Вами, странная структура, но такую предоставили, а переделывать за кого-то это не благодарный труд, приходится работать с данными в том виде, в котором они предоставлены.
Про "верную индексацию" немного развернутый можете сказать?
Спасибо.
С уважением, Александр.

Добавлено через 2 минуты
Цитата Сообщение от invm Посмотреть сообщение
Сделайте индекс по (Счет, Сумма desc)
invm, буду благодарен, если немного конкретней скажите что и где сделать. Моих познаний хватает только на простые запросы с выборкой и, иногда, с join...
Спасибо.
С уважением, Александр.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 12:27
Цитата Сообщение от alexandrstegnin Посмотреть сообщение
Про "верную индексацию" немного развернутый можете сказать?
это уже новый вопрос, создайте новую тему с таким вопросом
1
4 / 4 / 0
Регистрация: 09.01.2014
Сообщений: 130
17.02.2015, 12:54  [ТС]
Цитата Сообщение от Metall_Version Посмотреть сообщение
это уже новый вопрос, создайте новую тему с таким вопросом
Metall_Version, спасибо. Буду пока разбираться на этих примерах.
С уважением, Александр.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.02.2015, 12:54
Помогаю со студенческими работами здесь

Выборка последних ненулевых значений из столбца по двум условиям
пытаюсь написать формулу для :выборка последних не нулевых значений из столбца по двум условиям, но никак не получается( ...

Выборка данных из таблицы по нескольким условиям посредством макросов
Надо сделать выборку данных из таблицы по нескольким условиям посредством макросов. Условия выбираются через форму. Разумеется, проверять...

Вычисление суммы (среднего) значений, удовлетворяющих нескольким условиям
Приветствую. Возможно задачка уже и обсуждала, но что-то не нашел. Есть таблица - несколько колонок содержащих определенные признаки,...

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

Нахождение уникальных значений из таблицы по нескольким условиям
Добрый день, задался вопросом о нахождение уникальных значений из таблицы по нескольким условиям. Присутствует таблица с...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru