最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQLServer 數據庫的數據匯總完全解析(WITH ROLLUP)

 更新時間:2010年09月12日 21:37:12   作者:  
乍一看,好像很容易,用group by好像能實現?但仔細研究下去,你又會覺得group by也是無能為力,總欠缺點什么,無從下手。那么,到底該如何做呢?別急,SQL Server早就幫我們做好了,下面,跟我來。

現有表A,內容如下:

編碼  倉庫  數量
      01   A    6
      01   B    7
      02   A    8
      02   B    9

現在想按編碼查詢出這種格式:

01   A    6
      01   B    7
      匯總小計:   13
      02   A    8
      02   B    9
      匯總小計:   17

問:該如何實現?

乍一看,好像很容易,用group by好像能實現?但仔細研究下去,你又會覺得group by也是無能為力,總欠缺點什么,無從下手。那么,到底該如何做呢?別急,SQL Server早就幫我們做好了,下面,跟我來。

首先,讓我們來看一段話:

在生成包含小計和合計的報表時,ROLLUP 運算符很有用。ROLLUP 運算符生成的結果集類似于 CUBE 運算符所生成的結果集。

CUBE 運算符生成的結果集是多維數據集。多維數據集是事實數據的擴展,事實數據即記錄個別事件的數據。擴展建立在用戶打算分析的列上。這些列被稱為維。多維數據集是一個結果集,其中包含了各維度的所有可能組合的交叉表格。

CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包含維度列和聚合函數表達式。GROUP BY 應指定維度列和關鍵字 WITH CUBE。結果集將包含維度列中各值的所有可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。

CUBE 和 ROLLUP 之間的區(qū)別在于:

CUBE 生成的結果集顯示了所選列中值的所有組合的聚合。

ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。

看完以上的這段話,悟出了什么沒有?如果沒有,那么……嘿嘿,你的悟性還不夠喲,離“三花棸頂”還早著呢:)。接下來我們再看一段(注意喲,答案馬上就揭曉了):

SELECT 編碼, 倉庫, Sum(數量) as 數量
      FROM A
      GROUP BY 編碼, 倉庫 WITH ROLLUP

--關鍵就是后面的WITH ROLLUP

--當然,你也可以用WITH CUBE,但是結果會有點不大一樣

可能看完上面這段你還是覺得“云里霧里”,摸不著頭腦。實在不明白也沒關系,自己動手做。

首先:建一個上面所說的A表,輸入幾行數據;

接著:打開你的SQL Server查詢分析器,連上包含你上面所建A表的服務器,選擇包含該表的數據庫;

然后:Copy上面這段SQL 語句,Paste到查詢分析器中,按F5,怎么樣?看到下面出來了什么?是不是和我下面的一樣?

編碼    倉庫    數量
      01      A      6
      01      B      7
      01     NULL     13
      02      A      8
      02      B      9
      02     NULL     17
      NULL    NULL     30

--如果你用的是WITH CUBE,結果集的后面還會多出兩條(如果你也只是輸入示例中的幾行數據的話):

NULL     A     14
      NULL     B     16

咦!奇怪,結果中怎么有那么多“NULL”值?哈,別急,這幾行正是我們所要的匯總數據行,不難看出:

01 NULL 13正是對編碼為01的所有倉庫中的數量的匯總;02 NULL 17是對編碼為02的所有倉庫的數量的匯總;

NULL NULL 30是對所有資料行數量的匯總。

如何?答案出來了吧?是不是很簡單呢?當然,上面還有點美中不足,那就是有好多“NULL”的存在。如何去掉這些無意義的NULL呢?下面我們再進行優(yōu)化。

1、用Grouping替換NULL值

SELECT CASE WHEN (GROUPING(編碼) = 1) THEN 'ALL'
      ELSE ISNULL(編碼, 'UNKNOWN')
      END AS 編碼,
      CASE WHEN (GROUPING(倉庫) = 1) THEN 'ALL'
      ELSE ISNULL(倉庫, 'UNKNOWN')
      END AS 倉庫,
      SUM(數量) AS 數量
      FROM A
      GROUP BY 編碼, 倉庫 WITH ROLLUP

--適當的運用Case函數

結果我這里就不寫了,就是把上面的“NULL”值全部換成“ALL”字符串

2、利用程序做進一步的優(yōu)化

//通常為了顯示上的需要,我們必須對以上SQL語句生成的結果做一些優(yōu)化,下面給出自然語言描述:

WHILE(未到達最后一條記錄){
        IF 編碼值不為ALL而倉庫值為ALL
        {
           將編碼值用“小計:”替換,將倉庫值用""替換;
           將這一行的顏色標示為灰色;
        }
        ELSE 編碼值為ALL倉庫值也為ALL
       ?。?
           將編碼值用“總計:”替換,將倉庫值用""替換;
           將這一行的著色標示為淡綠色;
       ?。?
        指針移到下一條;
      }

相關文章

  • sql復制表結構和數據的實現方法

    sql復制表結構和數據的實現方法

    這篇文章主要介紹了sql復制表結構和數據的實現方法,需要的朋友可以參考下
    2010-06-06
  • SQL Server實現split函數分割字符串功能及用法示例

    SQL Server實現split函數分割字符串功能及用法示例

    這篇文章主要介紹了SQL Server實現split函數分割字符串功能及用法,結合實例形式分析了SQL Server實現split分割字符串的相關技巧與使用方法,需要的朋友可以參考下
    2016-08-08
  • Sql Server中的視圖介紹

    Sql Server中的視圖介紹

    這篇文章主要介紹了Sql Server中的視圖介紹,本文講解了視圖的定義、視圖的作用、創(chuàng)建視圖實例、刪除修改視圖等內容,需要的朋友可以參考下
    2015-01-01
  • 目前用到的兩個分頁存儲過程代碼

    目前用到的兩個分頁存儲過程代碼

    前用到的兩個分頁存儲過程,需要的朋友可以參考下。
    2009-09-09
  • SQL Server中的事務介紹

    SQL Server中的事務介紹

    這篇文章介紹了SQL Server中的事務用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 詳解SQL 通配符

    詳解SQL 通配符

    這篇文章主要介紹了SQL 通配符的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • SQL2008 詳解直接將XML存入到SQL中

    SQL2008 詳解直接將XML存入到SQL中

    這篇文章主要介紹了SQL2008 詳解直接將XML存入到SQL中的相關資料,需要的朋友可以參考下
    2017-01-01
  • SQL語句查詢數據庫中重復記錄的個數

    SQL語句查詢數據庫中重復記錄的個數

    一個sql語句:一個表test有四個字段id,a,b,c,如果表中的記錄有三個字段a,b,c都相等,則說明這條記錄是相同的,求相同的記錄的個數 。
    2009-11-11
  • sql server清理日志的實現步驟

    sql server清理日志的實現步驟

    清理 SQL Server 日志是數據庫管理的一項重要工作,可以釋放磁盤空間并提高數據庫性能,本文就來詳細的介紹一下,感興趣的可以了解一下
    2023-10-10
  • 常用SQL語句查詢分享

    常用SQL語句查詢分享

    本文通過幾個小例子,給大家分享一下常用SQL常用的語句,非常的簡單實用,有需要的小伙伴可以參考下。
    2016-01-01

最新評論

玉溪市| 兴山县| 台东县| 闻喜县| 郓城县| 威信县| 莎车县| 远安县| 北碚区| 呼和浩特市| 南安市| 桦川县| 闽清县| 朔州市| 都江堰市| 汝南县| 永修县| 晴隆县| 前郭尔| 班玛县| 鄢陵县| 兴化市| 衡阳市| 柏乡县| 韩城市| 大悟县| 河津市| 屏东县| 行唐县| 嘉荫县| 方城县| 明溪县| 扶余县| 加查县| 崇州市| 广东省| 衡山县| 滕州市| 青岛市| 佛学| 苏尼特左旗|