利用SQL生成月報表統計數據


 

  • 摘要:系統運行了一段時間,使用者往往都想知道系統的運行狀態,知道自己公司的業績等,這就經常要做些適用滿足客戶需求的報表.
 系統運行了一段時間,使用者往往都想知道系統的運行狀態,知道自己公司的業績等..;這就經常要做些適用滿足客戶需求的報表.其中下面這個案例是開發人員經常要面對的,我以前也碰到過,只是有時候沒有用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

    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM