将MySQL脚本移植到MS SQL->同时进行数据分配和检索

时间:2018-12-18 12:34:40

标签: mysql sql sql-server migration

我一直在努力使它工作数小时,但是我真的找不到解决方法。我有一个需要迁移到MS SQL 2014的MySQL脚本,但是,我似乎无法使其正常运行。据我了解,最大的问题是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中重新创建代码的方向吗?谢谢大家

2 个答案:

答案 0 :(得分:1)

在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;

如果您提供示例数据和所需结果,那么找出真正需要的功能会容易得多。

答案 1 :(得分:0)

我的大问题在于这一行:

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

但正如戈登·利诺夫(Gordon Linoff)指出的那样。此问题可以通过窗口函数解决,该函数的正确翻译为:

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

最终比我想象的要容易
非常感谢,希望它能对其他人有所帮助