【问题标题】:Port MySQL script to MS SQL -> simultaneous data asignement and retrieval将 MySQL 脚本移植到 MS SQL -> 同步数据分配和检索
【发布时间】:2019-05-18 21:02:56
【问题描述】:

我已经尝试了几个小时来完成这项工作,但我真的找不到办法。我有一个 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 中重新创建代码?先谢谢大家了

【问题讨论】:

    标签: mysql sql sql-server migration


    【解决方案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;
    

    如果您提供示例数据和所需的结果,则更容易找出您真正需要的功能。

    【讨论】:

    • 我无法发布数据,因为它是机密的,但您的回答为我指明了正确的方向,我已经发布了解决方案的答案,非常感谢
    【解决方案2】:

    我的大问题在于这一行:

    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
    

    结果比我想象的要容易
    非常感谢,我希望它也可以帮助其他人

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 2023-03-03
      • 2011-01-13
      • 2011-09-25
      • 2021-07-03
      • 1970-01-01
      相关资源
      最近更新 更多