将 MySQL 简单查询转换为 SQL Server

Posted

技术标签:

【中文标题】将 MySQL 简单查询转换为 SQL Server【英文标题】:Converting MySQL Simple Query to SQL Server 【发布时间】:2019-03-11 07:07:57 【问题描述】:

我已经完成了 mysql 简单查询,

SELECT 
  acc_trans.VoucherNumber,
  acc_trans.EntryDate,
  acc_trans.Debit,
  acc_trans.Credit,
  @Balance:= round(@Balance,2) + acc_trans.Debit - acc_trans.Credit AS  Balance
FROM acc_trans, (SELECT @Balance := 0) AS variableInit Where AccountName='Cash Account'
ORDER BY  acc_trans.TransactionID ASC 

输出

VoucherNumber  EntryDate    Debit         Credit      Balance
-------------------------------------------------------------
1            2019-01-12      0.00       2500.00     -2500.00
2            2019-02-12      0.00      15000.00    -17500.00
3            2019-02-12      0.00       1500.00    -19000.00
1            2019-02-12   4800.00        0.00      -14200.00

此查询运行良好的 MySQL 数据库。我有与 SQL Server 相同的数据库。 如何在 SQL Server 中执行此查询?

【问题讨论】:

SQL 不是数据库是指 sql server 吗? @ZaynulAbadinTuhin 嗯,我错了 【参考方案1】:

从 SQL Server 2008 开始,您可以使用 OVER 子句:

输入:

CREATE TABLE acc_trans (
    TransactionID int,
    VoucherNumber int,
    EntryDate date,
    Debit numeric(20, 2),         
    Credit numeric(20, 2)
)
INSERT INTO acc_trans 
    (TransactionID, VoucherNumber, EntryDate, Debit, Credit)
VALUES
    (1, 1, '2019-01-12',    0.00,  2500.00),
    (2, 2, '2019-02-12',    0.00, 15000.00),
    (3, 3, '2019-02-12',    0.00,  1500.00),
    (4, 1, '2019-02-12', 4800.00,     0.00)

声明:

SELECT 
  acc_trans.VoucherNumber,
  acc_trans.EntryDate,
  acc_trans.Debit,
  acc_trans.Credit,
  [Balance] = SUM(acc_trans.Debit - acc_trans.Credit) OVER (ORDER BY  acc_trans.TransactionID ASC)
FROM acc_trans
WHERE AccountName = 'Cash Account'

输出:

VoucherNumber   EntryDate   Debit    Credit     Balance
1               2019-01-12  0.00     2500.00    -2500.00
2               2019-02-12  0.00     15000.00   -17500.00
3               2019-02-12  0.00     1500.00    -19000.00
1               2019-02-12  4800.00  0.00       -14200.00

注意事项:

如果你想用SELECT语句给SQL Server中的变量赋值,documentation的备注很重要:

SELECT @local_variable 通常用于将单个值返回到 变量。但是,当表达式是列名时,它可以 返回多个值。如果 SELECT 语句返回多个 值,变量被分配最后一个返回的值。

不能使用包含变量赋值的 SELECT 语句 还可以执行典型的结果集检索操作。

【讨论】:

【参考方案2】:

这需要工作

declare @Balance int=0;

SELECT 
  acc_trans.VoucherNumber,
  acc_trans.EntryDate,
  acc_trans.Debit,
  acc_trans.Credit,
  @Balance = round(@Balance,2) + acc_trans.Debit - acc_trans.Credit AS  Balance
FROM acc_trans
Where AccountName='Cash Account'
ORDER BY  acc_trans.TransactionID ASC 

【讨论】:

以上是关于将 MySQL 简单查询转换为 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MySQL 查询转换为等效的 Oracle sql 查询

使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询

如何将 SQL 查询从 MySQL 8 转换为 MySQL 5.7

将 mysql 查询转换为 MS SQL

将 Access SQL 内部联接查询转换为 mySQL 查询的问题

将超大规模查询从 SQL Server 转换为 MySQL - JOIN 问题