欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

現(xiàn)有表A,內(nèi)容如下:

編碼  倉庫  數(shù)量
      01   A    6
      01   B    7
      02   A    8
      02   B    9

現(xiàn)在想按編碼查詢出這種格式:

01   A    6
      01   B    7
      匯總小計(jì):   13
      02   A    8
      02   B    9
      匯總小計(jì):   17

問:該如何實(shí)現(xiàn)?

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

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

在生成包含小計(jì)和合計(jì)的報(bào)表時(shí),ROLLUP 運(yùn)算符很有用。ROLLUP 運(yùn)算符生成的結(jié)果集類似于 CUBE 運(yùn)算符所生成的結(jié)果集。

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

CUBE 運(yùn)算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應(yīng)包含維度列和聚合函數(shù)表達(dá)式。GROUP BY 應(yīng)指定維度列和關(guān)鍵字 WITH CUBE。結(jié)果集將包含維度列中各值的所有可能組合,以及與這些維度值組合相匹配的基礎(chǔ)行中的聚合值。

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

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

ROLLUP 生成的結(jié)果集顯示了所選列中值的某一層次結(jié)構(gòu)的聚合。

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

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

--關(guān)鍵就是后面的WITH ROLLUP

--當(dāng)然,你也可以用WITH CUBE,但是結(jié)果會(huì)有點(diǎn)不大一樣

可能看完上面這段你還是覺得“云里霧里”,摸不著頭腦。實(shí)在不明白也沒關(guān)系,自己動(dòng)手做。

首先:建一個(gè)上面所說的A表,輸入幾行數(shù)據(jù);

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

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

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

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

NULL     A     14
      NULL     B     16

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

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

NULL NULL 30是對所有資料行數(shù)量的匯總。

如何?答案出來了吧?是不是很簡單呢?當(dāng)然,上面還有點(diǎn)美中不足,那就是有好多“NULL”的存在。如何去掉這些無意義的NULL呢?下面我們再進(jìn)行優(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(數(shù)量) AS 數(shù)量
      FROM A
      GROUP BY 編碼, 倉庫 WITH ROLLUP

--適當(dāng)?shù)倪\(yùn)用Case函數(shù)

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

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

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

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

相關(guān)文章

  • sql語句優(yōu)化之SQL Server(詳細(xì)整理)

    sql語句優(yōu)化之SQL Server(詳細(xì)整理)

    這篇文章主要介紹了sql語句優(yōu)化之SQL Server篇,整理的比較詳細(xì),推薦收藏
    2014-07-07
  • 行轉(zhuǎn)列之SQL SERVER PIVOT與用法詳解

    行轉(zhuǎn)列之SQL SERVER PIVOT與用法詳解

    這篇文章主要給大家介紹了關(guān)于行轉(zhuǎn)列之SQL SERVER PIVOT與用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SQL SERVER具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SQLServer中SELECT語句的執(zhí)行順序

    SQLServer中SELECT語句的執(zhí)行順序

    關(guān)于Sql中Select語句的執(zhí)行順序,一直很少注意這個(gè)問題,對于關(guān)鍵字的使用也很隨意,至于效率問題,因?yàn)楸碇械臄?shù)據(jù)量都不是很大,所以也不是很在意。
    2010-06-06
  • SqlServer常用函數(shù)及時(shí)間處理小結(jié)

    SqlServer常用函數(shù)及時(shí)間處理小結(jié)

    這篇文章主要介紹了SqlServer常用函數(shù)及時(shí)間處理小結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • SQL Server Bulk Insert 只需要部分字段時(shí)的方法

    SQL Server Bulk Insert 只需要部分字段時(shí)的方法

    上午在找Bulk Insert的資料看,還轉(zhuǎn)了一篇。不巧今天下午就用上了,我遇到的需求是導(dǎo)出表A中的N個(gè)字段,然后導(dǎo)入到表B的N個(gè)字段當(dāng)中。
    2011-10-10
  • asp.net 使用SqlBulkCopy極速插入數(shù)據(jù)到 SQL Server

    asp.net 使用SqlBulkCopy極速插入數(shù)據(jù)到 SQL Server

    今天早上reader 上收到cnblogs的訂閱里看到一個(gè)關(guān)于SQL語句快速插入的文章,提到SqlBulkCopy,感覺不錯(cuò),按他的測試SqlBulkCopy要比普通插入快近30倍,
    2010-04-04
  • delete from 表名與truncate table 表名區(qū)別

    delete from 表名與truncate table 表名區(qū)別

    delete from 表名與truncate table 表名區(qū)別,選擇適合我們的刪除數(shù)據(jù)庫數(shù)據(jù)的方法
    2012-10-10
  • SQL Server的觸發(fā)器你了解多少

    SQL Server的觸發(fā)器你了解多少

    這篇文章主要為大家詳細(xì)介紹了SQL Server觸發(fā)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 安裝SQL?Server2019詳細(xì)教程(推薦!)

    安裝SQL?Server2019詳細(xì)教程(推薦!)

    SQL Server數(shù)據(jù)庫是Microsoft開發(fā)設(shè)計(jì)的一個(gè)關(guān)系數(shù)據(jù)庫智能管理系統(tǒng)(RDBMS),現(xiàn)在是全世界主流數(shù)據(jù)庫之一,下面這篇文章主要給大家介紹了關(guān)于安裝SQL?Server2019詳細(xì)教程,需要的朋友可以參考下
    2022-11-11
  • Sql Server中的非聚集索引詳細(xì)介

    Sql Server中的非聚集索引詳細(xì)介

    這篇文章主要介紹了Sql Server中的非聚集索引詳細(xì)介,本文講解了非聚集索引為什么能提速這么快、什么是RID、非聚集索引的運(yùn)行原理等內(nèi)容,需要的朋友可以參考下
    2015-02-02

最新評論