- 摘要:系統運行了一段時間,使用者往往都想知道系統的運行狀態,知道自己公司的業績等,這就經常要做些適用滿足客戶需求的報表.
系統運行了一段時間,使用者往往都想知道系統的運行狀態,知道自己公司的業績等..;這就經常要做些適用滿足客戶需求的報表.其中下面這個案例是開發人員經常要面對的,我以前也碰到過,只是有時候沒有用sql去解決它,以前是在程序里頭作些處理來達到類似的功能.說了這么還沒有闡明到底是什么需求.
我這里有一個交易表 db_Transcation 記錄了每個客戶的交易情況.現在我想統計一個月內每天的交易情況.下面我用表格說明具體需求.
db_Transaction的結構簡化如下:
create table db_Transaction
(
dt_id int identify(1) primary key,
dt_clientNo varchar(50) not null ,
dt_money int not null,
dt_Datetime datetime
)
具有數據如下:
dt_id dt_clientNo dt_money dt_DateTime
1 001 10 2007-11-1
2 001 11 2007-11-2
3 001 40 2007-11-3
..................
我需要得出如下統計格式
dt_clientNo 1日 2日 3日 ........31日
001 10 11 40
........
以前一般是先group by dt_clientNo 這個字段,然后在vs.net里頭,構造一個結構類似需求的DataSet;然后填充數據
其實我們完全能夠用SQL完成這個需求;
設計的SQL腳本如下:
--建立存儲過程(參數:年、月)
CREATE PROC Report_Details
@YEAR INT,
@MONTH INT
AS
DECLARE @SQL VARCHAR(8000)
DECLARE @DayOfMonth INT
DECLARE @I INT
SET @DayOfMonth=DATEDIFF(day,cast(@YEAR as varchar)+ '- '+cast(@MONTH as varchar)+ '-01 ',
cast(@YEAR as varchar)+ '- '+cast(@MONTH+1 as varchar)+ '-01 ') -- 獲取這個月的天數
SET @SQL= 'SELECT dt_clientNo'
SET @I=1
WHILE @I <=@DayOfMonth
BEGIN
SET @SQL=@SQL+ ',[ '+CAST(@I AS VARCHAR(10))+ ']=0 '
SET @I=@I+1
END
SET @SQL=@SQL+ ' INTO Tmp3 FROM (SELECT DISTINCT NO FROM TEST) X '
EXEC(@SQL) --生成表結構並初試化為0
我這里有一個交易表 db_Transcation 記錄了每個客戶的交易情況.現在我想統計一個月內每天的交易情況.下面我用表格說明具體需求.
db_Transaction的結構簡化如下:
create table db_Transaction
(
dt_id int identify(1) primary key,
dt_clientNo varchar(50) not null ,
dt_money int not null,
dt_Datetime datetime
)
具有數據如下:
dt_id dt_clientNo dt_money dt_DateTime
1 001 10 2007-11-1
2 001 11 2007-11-2
3 001 40 2007-11-3
..................
我需要得出如下統計格式
dt_clientNo 1日 2日 3日 ........31日
001 10 11 40
........
以前一般是先group by dt_clientNo 這個字段,然后在vs.net里頭,構造一個結構類似需求的DataSet;然后填充數據
其實我們完全能夠用SQL完成這個需求;
設計的SQL腳本如下:
--建立存儲過程(參數:年、月)
CREATE PROC Report_Details
@YEAR INT,
@MONTH INT
AS
DECLARE @SQL VARCHAR(8000)
DECLARE @DayOfMonth INT
DECLARE @I INT
SET @DayOfMonth=DATEDIFF(day,cast(@YEAR as varchar)+ '- '+cast(@MONTH as varchar)+ '-01 ',
cast(@YEAR as varchar)+ '- '+cast(@MONTH+1 as varchar)+ '-01 ') -- 獲取這個月的天數
SET @SQL= 'SELECT dt_clientNo'
SET @I=1
WHILE @I <=@DayOfMonth
BEGIN
SET @SQL=@SQL+ ',[ '+CAST(@I AS VARCHAR(10))+ ']=0 '
SET @I=@I+1
END
SET @SQL=@SQL+ ' INTO Tmp3 FROM (SELECT DISTINCT NO FROM TEST) X '
EXEC(@SQL) --生成表結構並初試化為0
SET @SQL= ' '
SET @I=1
WHILE @I <=@DayOfMonth
BEGIN
SET @SQL=@SQL+ 'UPDATE Tmp3 SET [ '+CAST(@I AS VARCHAR(10))+ ']=a.[Money] FROM db_Transaction a,Tmp3 b WHERE a.dt_clientNo=b.dt_clientNo AND DAY(a.[dt_DateTime])= '+CAST(@I AS VARCHAR(10))+CHAR(10)
SET @I=@I+1
END --賦值
EXEC(@SQL)
SELECT * FROM Tmp3
GO
--調用過程
EXEC Report_Details '2006 ', '1 '
--刪除測試環境
DROP TABLE Tmp3
DROP PROC Report_Details