Nano Hash - криптовалюты, майнинг, программирование

Рассчитать баланс с самым быстрым алгоритмом

Я внедряю бухгалтерскую программу.

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

Это мои таблицы:

Таблица Темы:

TopicID nvarchar(50) -- is Parent Field
ParentID nvarchar(50) -- is Child Field
Description nvarchar(512) 
------------DocumentDetal table
DocumentNumber nvarchar(50)
TopicFK nvarchar(50)  
Debit decimal(18,0)
Credit decimal(18,0)

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

Ниже приведены образцы данных:

Это таблица тем и данные

Ниже приведены документы:

введите здесь описание изображения

На самом деле я хочу следующие результаты расчета:

введите здесь описание изображения


  • Некоторые участники здесь могут быть хороши в алгоритмах, но не в бухгалтерии. Итак, не могли бы вы объяснить, по какой логике рассчитывать баланс по вашим таблицам? Лучше использовать пример данных и ожидаемый результат. 12.05.2016
  • Для какой СУБД это? Добавьте тег, чтобы указать, используете ли вы mysql, postgresql, sql-server, oracle или db2, или что-то другое. 12.05.2016
  • Предоставлена ​​внешняя информация @PhamX.Bach, пожалуйста, помогите. 12.05.2016
  • Вы имели в виду, помещая С# и SQL Server, что вы хотите, чтобы мы написали код на С# или, скорее, SQL? Вы написали что-то о процедуре, но тег c# немного вводит в заблуждение. 12.05.2016
  • @JakubSzumiato Я хочу написать хранимую процедуру sql и использовать процедуру в С#, но моя проблема - это просто sql. 12.05.2016
  • Почему таблица продаж иерархическая? Я бы просто сделал это таблицей продаж и субпродаж. Или сами субпродажи могут снова иметь субпродажи? 12.05.2016
  • @Thorsten Kettner это дерево, и у него может быть больше детей 12.05.2016
  • Хорошо, тогда в вашей таблице документов нет записи для темы 010, вероятно, потому, что это родительская запись. Или это совпадение? А если у меня три уровня, ID 010 -> ID 010001 -> ID 010001001, могут ли быть записи документов с ID 010? С идентификатором 010001? Или только с ID 010001001? 12.05.2016
  • всегда у вас есть только последний уровень для использования в таблице documentdetail @ThorstenKettner 12.05.2016
  • Я пытался найти рекурсивный запрос, решающий это, но потерпел неудачу. Я думаю, что дошел до создания нужных записей, но не смог их заказать, что делает результаты бесполезными. Следовательно, я бы просто выбрал агрегаты для каждого идентификатора темы в SQL, а все остальное сделал на уровне приложения, то есть на С#. 12.05.2016

Ответы:


1

Для вашего SQL Server 2008 R2, Вот для sumDebit and sumCredit. Не понимаю, как рассчитать Res Debit and Res credit, но я думаю, что вы могли бы отредактировать, чтобы получить и Res value.

Во всяком случае, это использует CTE благодаря Mikael Eriksson в рекурсивной сумме в древовидной структуре

with T as
(   
    select t.TopicID, t.ParentID, sum(d.Debit) as sumDebit, sum(d.Credit) as sumCredit
    from Topics t
    left join DocumentDetail d 
    on t.TopicID = d.TopicFK
    group by t.TopicID, t.ParentID
)
,C as
(
    select T.TopicID,
         T.sumDebit,
         T.sumCredit,
         T.TopicID as RootID
    from T
    union all
    select T.TopicID,
         T.sumDebit,
         T.sumCredit,
         C.RootID
    from T
    inner join C 
    on T.ParentId = C.TopicID
)
select T.TopicID,
       T.ParentId,
       S.sumDebitIncludingChildren sumDebit,
       S.sumCreditIncludingChildren sumCredit
from T
  inner join (
             select RootID,
                    sum(sumDebit) as sumDebitIncludingChildren,
                    sum(sumCredit) as sumCreditIncludingChildren
             from C
             group by RootID
             ) as S
    on T.TopicID = S.RootID
order by T.TopicID
option (maxrecursion 0);

Проверено нормально в SQL Fiddle

12.05.2016
  • ваш код работает, но недостаточно быстро, он выполняется за 8 секунд, но мой текущий алгоритм выполняется за 2 секунды 12.05.2016
  • Если я не ошибаюсь, показанный запрос учитывает только родителей и детей, а не внуков и далее. Но у вас, @franchesco totti, уже есть работающий рекурсивный алгоритм и он занимает всего 2 секунды, но вы считаете это слишком медленным и нужно что-то побыстрее? 12.05.2016
  • @Thorsten Kettner option (maxrecursion 0); и да, sql плохо справляется с расчетом древовидной структуры, может быть, было бы лучше, если бы мы позволили C # взять на себя остальное или, может быть, изменили реализацию табличных данных? 12.05.2016
  • @ Фам X. Бах: Да, вы правы, CTE C рекурсивен. Извиняюсь. 12.05.2016
  • Вчера мне тоже было лень анализировать ваш запрос. Я был озадачен, как вы упорядочили свои результаты, потому что именно здесь я потерпел неудачу. Это показывает, что вы полагаетесь на дочерние идентификаторы ParentId + extension. Если бы это было не так, вы не могли бы привести свои рекурсивные результаты в желаемый порядок. Это то, что следует указать. В любом случае, хороший ответ. 13.05.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..