alasql
Version:
AlaSQL.js - JavaScript SQL database library for relational and graph data manipulation with support of localStorage, IndexedDB, and Excel
229 lines (189 loc) • 8.26 kB
JavaScript
if(typeof exports === 'object') {
var assert = require("assert");
var alasql = require('..');
} else {
__dirname = '.';
};
// See http://www.codeproject.com/Articles/300785/Calculating-simple-running-totals-in-SQL-Server
describe('Test 229 Calculating simple running totals', function() {
it("1. Init database", function(done) {
alasql('CREATE DATABASE test229; USE test229;');
alasql('CREATE TABLE RunTotalTestData ( \
id int not null identity(1,1) primary key, \
[value] int not null \
)');
// TODO Fix test with AUTOINCREMENT
alasql('insert into RunTotalTestData ([value]) values (1)');
alasql('insert into RunTotalTestData ([value]) values (2)');
alasql('insert into RunTotalTestData ([value]) values (4)');
alasql('insert into RunTotalTestData ([value]) values (7)');
alasql('insert into RunTotalTestData ([value]) values (9)');
alasql('insert into RunTotalTestData ([value]) values (12)');
alasql('insert into RunTotalTestData ([value]) values (13)');
alasql('insert into RunTotalTestData ([value]) values (16)');
alasql('insert into RunTotalTestData ([value]) values (22)');
alasql('insert into RunTotalTestData ([value]) values (42)');
alasql('insert into RunTotalTestData ([value]) values (57)');
alasql('insert into RunTotalTestData ([value]) values (58)');
alasql('insert into RunTotalTestData ([value]) values (59)');
alasql('insert into RunTotalTestData ([value]) values (60)');
done();
});
it("2. Select accumulated sum", function(done) {
var res = alasql('SELECT a.id, a.[value], (SELECT SUM(b.[value]) \
FROM RunTotalTestData b \
WHERE b.id <= a.id) AS total \
FROM RunTotalTestData a \
ORDER BY a.id;');
// console.log(res);
assert.deepEqual(res,[ { id: 1, value: 1, total: 1 },
{ id: 2, value: 2, total: 3 },
{ id: 3, value: 4, total: 7 },
{ id: 4, value: 7, total: 14 },
{ id: 5, value: 9, total: 23 },
{ id: 6, value: 12, total: 35 },
{ id: 7, value: 13, total: 48 },
{ id: 8, value: 16, total: 64 },
{ id: 9, value: 22, total: 86 },
{ id: 10, value: 42, total: 128 },
{ id: 11, value: 57, total: 185 },
{ id: 12, value: 58, total: 243 },
{ id: 13, value: 59, total: 302 },
{ id: 14, value: 60, total: 362 } ]);
//};
done();
});
it("3. Select accumulated sum", function(done) {
var res = alasql('SELECT a.id, a.[value], SUM(b.[value]) AS total \
FROM RunTotalTestData a, \
RunTotalTestData b \
WHERE b.id <= a.id \
GROUP BY a.id, a.[value] \
ORDER BY a.id');
assert.deepEqual(res,[ { id: 1, value: 1, total: 1 },
{ id: 2, value: 2, total: 3 },
{ id: 3, value: 4, total: 7 },
{ id: 4, value: 7, total: 14 },
{ id: 5, value: 9, total: 23 },
{ id: 6, value: 12, total: 35 },
{ id: 7, value: 13, total: 48 },
{ id: 8, value: 16, total: 64 },
{ id: 9, value: 22, total: 86 },
{ id: 10, value: 42, total: 128 },
{ id: 11, value: 57, total: 185 },
{ id: 12, value: 58, total: 243 },
{ id: 13, value: 59, total: 302 },
{ id: 14, value: 60, total: 362 } ]);
done();
});
it("4. Select accumulated sum", function(done) {
var res = alasql('SELECT a.id, a.[value], (SELECT SUM(b.[value]) \
FROM RunTotalTestData b \
WHERE b.id <= a.id \
AND b.[value] % 2 = 1) runningtotal\
FROM RunTotalTestData a \
WHERE a.[value] % 2 = 1 \
ORDER BY a.id;');
assert.deepEqual(res, [ { id: 1, value: 1, runningtotal: 1 },
{ id: 4, value: 7, runningtotal: 8 },
{ id: 5, value: 9, runningtotal: 17 },
{ id: 7, value: 13, runningtotal: 30 },
{ id: 11, value: 57, runningtotal: 87 },
{ id: 13, value: 59, runningtotal: 146 } ]);
done();
});
it("5. Select accumulated sum", function(done) {
var res = alasql('SELECT a.id, a.[value], SUM(b.[value]) AS runningtotal\
FROM RunTotalTestData a, \
RunTotalTestData b \
WHERE b.id <= a.id \
AND a.[value] % 2 = 1 \
AND b.[value] % 2 = 1 \
GROUP BY a.id, a.[value] \
ORDER BY a.id;');
//console.log(res);
assert.deepEqual(res, [ { id: 1, value: 1, runningtotal: 1 },
{ id: 4, value: 7, runningtotal: 8 },
{ id: 5, value: 9, runningtotal: 17 },
{ id: 7, value: 13, runningtotal: 30 },
{ id: 11, value: 57, runningtotal: 87 },
{ id: 13, value: 59, runningtotal: 146 } ]);
done();
});
it("6. Select accumulated sum", function(done) {
var res = alasql('SELECT a.[value]%2 as even, a.id, a.[value], (SELECT SUM(b.[value]) \
FROM RunTotalTestData b \
WHERE b.id <= a.id \
AND b.[value]%2 = a.[value]%2) as total \
FROM RunTotalTestData a \
ORDER BY [value]%2, a.id;');
assert.deepEqual(res,[ { even: 0, id: 2, value: 2, total: 2 },
{ even: 0, id: 3, value: 4, total: 6 },
{ even: 0, id: 6, value: 12, total: 18 },
{ even: 0, id: 8, value: 16, total: 34 },
{ even: 0, id: 9, value: 22, total: 56 },
{ even: 0, id: 10, value: 42, total: 98 },
{ even: 0, id: 12, value: 58, total: 156 },
{ even: 0, id: 14, value: 60, total: 216 },
{ even: 1, id: 1, value: 1, total: 1 },
{ even: 1, id: 4, value: 7, total: 8 },
{ even: 1, id: 5, value: 9, total: 17 },
{ even: 1, id: 7, value: 13, total: 30 },
{ even: 1, id: 11, value: 57, total: 87 },
{ even: 1, id: 13, value: 59, total: 146 } ]);
done();
});
it("7. Select accumulated sum", function(done) {
alasql.fn.mod = function(a,b){return a%2 == b%2};
var res = alasql('SELECT [value]%2 AS even, id, [value], SUM(b.[value]) AS total \
FROM RunTotalTestData a, \
RunTotalTestData b \
WHERE a.[value]%2 = b.[value]%2 \
AND b.id <= a.id \
GROUP BY a.[value]%2, a.id, a.[value] \
ORDER BY [value]%2, id;');
assert.deepEqual(res,[ { even: 0, id: 2, value: 2, total: 2 },
{ even: 0, id: 3, value: 4, total: 6 },
{ even: 0, id: 6, value: 12, total: 18 },
{ even: 0, id: 8, value: 16, total: 34 },
{ even: 0, id: 9, value: 22, total: 56 },
{ even: 0, id: 10, value: 42, total: 98 },
{ even: 0, id: 12, value: 58, total: 156 },
{ even: 0, id: 14, value: 60, total: 216 },
{ even: 1, id: 1, value: 1, total: 1 },
{ even: 1, id: 4, value: 7, total: 8 },
{ even: 1, id: 5, value: 9, total: 17 },
{ even: 1, id: 7, value: 13, total: 30 },
{ even: 1, id: 11, value: 57, total: 87 },
{ even: 1, id: 13, value: 59, total: 146 } ]);
done();
});
//}
// SQL NOT REALIZED YET
it("8. Over 1", function(done) {
var ast = alasql.parse('SELECT a.id, a.[value], SUM(a.[value]) OVER (ORDER BY a.id) \
FROM RunTotalTestData a \
ORDER BY a.id;');
// console.log(ast.toString());
done();
});
it("8. Over 2", function(done) {
var ast = alasql.parse('SELECT a.id, a.[value], SUM(a.[value]) OVER (ORDER BY a.id) \
FROM RunTotalTestData a \
WHERE a.[value] % 2 = 1 \
ORDER BY a.id;');
// console.log(ast.toString());
done();
});
it("9. Over 3", function(done) {
var ast = alasql.parse('SELECT a.value%2, a.id, a.[value], SUM(a.[value]) OVER (PARTITION BY a.[value]%2 ORDER BY a.id) \
FROM RunTotalTestData a \
ORDER BY a.[value]%2, a.id;');
// console.log(ast.toString());
done();
});
it("99. Drop database", function(done) {
alasql('DROP DATABASE test229');
done();
});
});