TrungBravo
07-30-2010, 02:44 PM
Yêu cầu: từ dữ liệu thu chi (#TransTemp) và số dư đầu (#BalanceTemp) lập sổ quỹ tiền mặt
#BalanceTemp chỉ bằng 1 câu lệnh tạo ra kết quả có nội dung như sau
+--+---------+----+--------+--------+-------+
|Id| Ngay_Ct | Tk |Tien_Thu|Tien_Chi| So_Du |
+--+---------+----+--------+--------+-------+
| 1| 1/1/2010| 111|__500000|_______0|3500000|
| 2| 1/1/2010| 111|_______0|__400000|3100000|
...
+--+---------+----+--------+--------+-------+
trong đó cột So_Du là số dư của tài khoản sau khi nghiệp vụ phát sinh
Câu lệnh tạo bảng temp như sau
SET NOCOUNT ON;
IF OBJECT_ID('TempDb..#BalanceTemp') IS NOT NULL DROP TABLE #BalanceTemp;
CREATE TABLE #BalanceTemp (Tk Int, Du_Dau_Ky Numeric(18));
INSERT INTO #BalanceTemp (Tk, Du_Dau_Ky) VALUES (111, 3000000);
INSERT INTO #BalanceTemp (Tk, Du_Dau_Ky) VALUES (112, 4000000);
IF OBJECT_ID('TempDb..#TransTemp') IS NOT NULL DROP TABLE #TransTemp
CREATE TABLE #TransTemp (Id Int Identity (1, 1),
Tk Int,
Ngay_Ct datetime,
Tien_Thu Numeric(18),
Tien_Chi Numeric(18))
DECLARE @_i Numeric(8), @_Thu_Chi Int, @_Tien_Thu Numeric(18),
@_Tien_Chi Numeric(18), @_RandomValue Numeric(18), @_Date datetime;
SELECT @_i = 1, @_Thu_Chi = 1, @_Date = 'Jan 1, 2010';
WHILE @_i <= 10000
BEGIN
SET @_RandomValue = (RAND() * 1000 + RAND() * 1000 + RAND() * 1000) + (RAND() * 100 + RAND() * 100 + RAND() * 100);
IF @_Thu_Chi = 1
SELECT @_Tien_Thu = @_RandomValue , @_Tien_Chi = 0, @_Thu_Chi = 0;
ELSE
SELECT @_Tien_Thu = 0, @_Tien_Chi = @_RandomValue, @_Thu_Chi = 1;
INSERT INTO #TransTemp (Ngay_Ct, Tk, Tien_Thu, Tien_Chi)
VALUES (DATEADD(day, RAND(), @_Date), 111, @_Tien_Thu, @_Tien_Chi);
IF @_Thu_Chi = 1
SET @_Date = DATEADD(day, 1, @_Date)
SET @_i = @_i + 1;
END
CREATE UNIQUE INDEX #PK_TranTemp_Id ON #TransTemp (Id)
#BalanceTemp chỉ bằng 1 câu lệnh tạo ra kết quả có nội dung như sau
+--+---------+----+--------+--------+-------+
|Id| Ngay_Ct | Tk |Tien_Thu|Tien_Chi| So_Du |
+--+---------+----+--------+--------+-------+
| 1| 1/1/2010| 111|__500000|_______0|3500000|
| 2| 1/1/2010| 111|_______0|__400000|3100000|
...
+--+---------+----+--------+--------+-------+
trong đó cột So_Du là số dư của tài khoản sau khi nghiệp vụ phát sinh
Câu lệnh tạo bảng temp như sau
SET NOCOUNT ON;
IF OBJECT_ID('TempDb..#BalanceTemp') IS NOT NULL DROP TABLE #BalanceTemp;
CREATE TABLE #BalanceTemp (Tk Int, Du_Dau_Ky Numeric(18));
INSERT INTO #BalanceTemp (Tk, Du_Dau_Ky) VALUES (111, 3000000);
INSERT INTO #BalanceTemp (Tk, Du_Dau_Ky) VALUES (112, 4000000);
IF OBJECT_ID('TempDb..#TransTemp') IS NOT NULL DROP TABLE #TransTemp
CREATE TABLE #TransTemp (Id Int Identity (1, 1),
Tk Int,
Ngay_Ct datetime,
Tien_Thu Numeric(18),
Tien_Chi Numeric(18))
DECLARE @_i Numeric(8), @_Thu_Chi Int, @_Tien_Thu Numeric(18),
@_Tien_Chi Numeric(18), @_RandomValue Numeric(18), @_Date datetime;
SELECT @_i = 1, @_Thu_Chi = 1, @_Date = 'Jan 1, 2010';
WHILE @_i <= 10000
BEGIN
SET @_RandomValue = (RAND() * 1000 + RAND() * 1000 + RAND() * 1000) + (RAND() * 100 + RAND() * 100 + RAND() * 100);
IF @_Thu_Chi = 1
SELECT @_Tien_Thu = @_RandomValue , @_Tien_Chi = 0, @_Thu_Chi = 0;
ELSE
SELECT @_Tien_Thu = 0, @_Tien_Chi = @_RandomValue, @_Thu_Chi = 1;
INSERT INTO #TransTemp (Ngay_Ct, Tk, Tien_Thu, Tien_Chi)
VALUES (DATEADD(day, RAND(), @_Date), 111, @_Tien_Thu, @_Tien_Chi);
IF @_Thu_Chi = 1
SET @_Date = DATEADD(day, 1, @_Date)
SET @_i = @_i + 1;
END
CREATE UNIQUE INDEX #PK_TranTemp_Id ON #TransTemp (Id)