【问题标题】:Convert query from SQL Server to SQLite将查询从 SQL Server 转换为 SQLite
【发布时间】:2021-03-17 21:09:53
【问题描述】:

我想从 2 个按日期排序的表中获取数据:以获取客户的累积余额。

我想从中获取数据的 2 个表是我的表:transfers & trans_payments 我使用 SQL 服务器完成了这项工作,这里是查询:

SELECT TOP 1000000 
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)) num_col, 
    ID, cust_id, final, value, date, 
    SUM(balance) OVER (PARTITION BY cust_id
                       ORDER BY date, seq, ID) balance, 
    note
FROM
    (SELECT 
         ID, cust_id, final, 0, final balance, date, note, 0
     FROM 
         transfers 
     UNION ALL
     SELECT 
         ID, cust_id, 0, value, - value, date, note, 1
     FROM 
         trans_payments) t (ID, cust_id, final, value, balance, date, note, seq)
ORDER BY 
    cust_id, date, seq

但我想将此查询转换为在 SQLite 中使用它,以及我到目前为止所做的:

SELECT ROW_NUMBER() OVER (ORDER BY 
(SELECT 1)) num_col, ID, cust_id, final, value, date, sum(balance) OVER 
(partition BY cust_id
ORDER BY date, seq, ID) balance, note
FROM (SELECT ID, cust_id, final, 0, final balance, date, note, 0
FROM transfers UNION ALL
SELECT ID, cust_id, 0, value, - value, date, note, 1
FROM trans_payments) t (ID, cust_id, final, value, balance, date, note, seq)
ORDER BY cust_id, date, seq

但我收到此错误:near "near "(": syntax error

转会:

ID        int   
cust_id   int   
tfrom     nvarchar(200) 
tto       nvarchar(200)
price     decimal(18, 2)
tax       decimal(18, 2)
final     Calculated 
tnumber   nvarchar(30)
note      nvarchar(MAX)
date      date

trans_payments:

ID       int
cust_id  int
value    decimal(18, 2)
method   nvarchar(30)
note     nvarchar(MAX)
date     date

假设我有这些数据:

转会:

ID    cust_id   final       date    
1      5        3000     22-09-2020  
2      5        1500     25-09-2020 
3      10       4000     28-09-2020

trans_payments:

ID    cust_id   value       date  
1      5        1000     22-09-2020
2      5        1500     23-09-2020
3      5        1000     01-10-2020
4      10       1000     28-09-2020
5      10       2000     01-10-2020

我想创建一个视图来显示客户对购买和付款的操作,如下所示:

客户 5:

cust_id   final    value    Balance    date      
5        3000        0       3000     22-09-2020 --- > Purchases 
5         0        1000      2000     22-09-2020 --- > payment
5         0        1500      500      23-09-2020 --- > payment
5        1500        0       2000     25-09-2020 --- > P
5         0        1000      1000     23-09-2020 --- > payment purchases 

这里

【问题讨论】:

  • 我认为 SQLite 不支持表别名后的列别名。将它们放在子查询中
  • @Charlieface 我遇到了很多我无法弄清楚的错误。

标签: sql-server sqlite


【解决方案1】:

在 SQLite 中,您应该在子查询中设置子查询的列别名。
另外,在ORDER BY 子句之后使用LIMIT 而不是TOP

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) num_col, 
       ID, cust_id, final, value, date, 
       SUM(balance) OVER (PARTITION BY cust_id ORDER BY date, seq, ID) balance, 
       note
FROM (
  SELECT ID, cust_id, final, 0 value, final balance, date, note, 0 seq
  FROM transfers 
  UNION ALL
  SELECT ID, cust_id, 0, value, - value, date, note, 1
  FROM trans_payments
)
ORDER BY cust_id, date, seq
LIMIT 1000000

请参阅demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2015-11-29
    • 2016-07-29
    • 2020-03-06
    相关资源
    最近更新 更多