Перенос MySQL скрипта в MS SQL -> одновременное присвоение и извлечение данных

Я часами пытаюсь выполнить эту работу, но не могу найти способ сделать это. У меня есть сценарий MySQL, который мне нужно перенести на MS SQL 2014, однако я не могу заставить его работать. Насколько я понял, большая проблема в том, что MySQL допускает такие инструкции:

SELECT @row_number = @row_number + 1, hora_int FROM table1;

где вы присваиваете значение одновременно с извлечением данных, а MS SQL этого не делает.

У меня есть относительно большой скрипт, в котором есть эта проблема:

SELECT GLOBAL.year, GLOBAL.month, '1111111' as metric_id, GLOBAL.margin as metric_value FROM (SELECT A.year,
         A.month,
         CASE
           WHEN A.month = 1 THEN (@csum_fdo := A.imp)
           ELSE (@csum_fdo := @csum_fdo + A.imp) END as margin
  FROM (SELECT Act.year, Act.month, Act.imp - Pas.imp as imp
        FROM (SELECT year(tie.date) as year, month(tie.date) as month, sum(importe) as imp
              FROM accounting con,
                   dim_time tie,
                   dim_account cta
              WHERE con.account_date = tie.date
                AND con.account = cta.nivel_10
                AND cta.level_id = '2'
                AND con.subtype_id <> 'O'
              GROUP BY year(tie.date),
                       month(tie.date)) Act,
             (SELECT year(tie.date) as year, month(tie.date) as month, sum(importe) * -1 as imp
              FROM accounting con,
                   dim_time tie,
                   dim_account cta
              WHERE con.account_date = tie.date
                AND con.account = cta.nivel_10
                AND cta.level_id = '3'
                AND con.subtype_id <> 'O'
              GROUP BY year(tie.date),
                       month(tie.date)) Pas
        WHERE Act.year = Pas.year
          AND Act.month = Pas.month) A,
       (SELECT @csum_fdo := 0) E) GLOBAL

Может ли кто-нибудь указать мне, что мне нужно сделать, чтобы воссоздать код в MS SQL? Спасибо всем заранее

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
19
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В SQL Server и (MyQL 8+) вы используете оконные функции. Эквивалент:

SELECT @row_number = @row_number + 1, hora_int
FROM table1
ORDER BY col;

является:

SELECT ROW_NUMBER() OVER (ORDER BY col), hora_int
FROM table1;

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

Я не мог опубликовать данные, потому что они были конфиденциальными, но ваш ответ указал мне правильное направление, я отправил ответ с решением, большое спасибо

Kailegh 20.12.2018 13:59
Ответ принят как подходящий

Моя большая проблема заключалась в этой строке:

CASE
           WHEN A.month = 1 THEN (@csum_fdo := A.imp)
           ELSE (@csum_fdo := @csum_fdo + A.imp) END as margin

но как указал мне Гордон Линофф. эта проблема может быть решена с помощью оконных функций, правильный перевод этой функции:

SUM(A.imp) OVER(PARTITION BY A.Year ORDER BY A.month) as margin

все оказалось проще, чем я думал
Большое спасибо, и я надеюсь, что это может помочь другим

Другие вопросы по теме

Похожие вопросы