有个表cashdue 字段如下
number,supplycode,brief,amount1,amount2,amount3,amount4
001 001 办公费用 100 0 20 30
002 001 货款支出 200 50 20 30
003 001 货款支出 300 50 20 30
003 001 货款支出 400 0 20 30
这些信息为应付账款信息
现在要的结果集如下
number,supplycode,brief,amount1,amount2,amount3,amount4,balance
期初余额 1500 0 0 0 1500
001 001 办公费用 100 0 20 30 1550
002 001 货款支出 200 50 20 30 1650
003 001 货款支出 300 50 20 30 1850
003 001 货款支出 400 0 20 30 2150
balance的值是上一行的balance+本行(amount1-amount2-amount3-amount4)
sql我是写出来了,但是很没效率居然比游标还要慢,测试数据1W条,游标17秒,我那句10分钟
主要是先排序出行号,在以行号来算出此行之前有几行数据,然后在汇总,在连接。我不太懂优化,
我希望大家能以1W条数据来测试。
number,supplycode,brief,amount1,amount2,amount3,amount4
001 001 办公费用 100 0 20 30
002 001 货款支出 200 50 20 30
003 001 货款支出 300 50 20 30
003 001 货款支出 400 0 20 30
这些信息为应付账款信息
现在要的结果集如下
number,supplycode,brief,amount1,amount2,amount3,amount4,balance
期初余额 1500 0 0 0 1500
001 001 办公费用 100 0 20 30 1550
002 001 货款支出 200 50 20 30 1650
003 001 货款支出 300 50 20 30 1850
003 001 货款支出 400 0 20 30 2150
balance的值是上一行的balance+本行(amount1-amount2-amount3-amount4)
sql我是写出来了,但是很没效率居然比游标还要慢,测试数据1W条,游标17秒,我那句10分钟
主要是先排序出行号,在以行号来算出此行之前有几行数据,然后在汇总,在连接。我不太懂优化,
我希望大家能以1W条数据来测试。
supplycode = '',
brief = '期初余额',
amount1 = 1500,
amount2 = 0,
amount3 = 0,
amount4 = 0,
balance = 1500
UNION ALL
SELECT cashdue.number,
cashdue.supplycode,
cashdue.brief,
cashdue.amount1,
cashdue.amount2,
cashdue.amount3,
cashdue.amount4,
balance = SUM(A.balance)
FROM cashdue
LEFT JOIN (SELECT number,
supplycode,
brief,
amount1,
amount2,
amount3,
amount4,
balance = amount1-amount2-amount3-amount4
FROM cashdue
UNION ALL
SELECT number = '',
supplycode = '',
brief = '期初余额',
amount1 = 1500,
amount2 = 0,
amount3 = 0,
amount4 = 0,
balance = 1500) A
ON CONVERT(int,cashdue.number) <= CONVERT(int,A.number)
OR A.number = ''
GROUP BY cashdue.number,
cashdue.supplycode,
cashdue.brief,
cashdue.amount1,
cashdue.amount2,
cashdue.amount3,
cashdue.amount4