1. 程式人生 > >含有GROUP BY子句的查詢中如何顯示COUNT()為0的結果( SELECT語句完整的執行順序)

含有GROUP BY子句的查詢中如何顯示COUNT()為0的結果( SELECT語句完整的執行順序)

含有GROUP BY子句的查詢中如何顯示COUNT()為0的結果

本文我們主要介紹了SQL Server資料庫中在使用GROUP BY對查詢出的結果進行分組時,COUNT()為0的結果無法顯示的解決方法,希望能夠對您有所幫助。

SQL Server資料庫查詢中,為了對查詢結果進行對比、分析,我們經常會用到GROUP BY子句以及COUNT()函式來對查詢結果進行分類、統計等。但是我們在使用的過程中往往會存在一些問題,本文我們就介紹了一個問題,並給出了它的解決方案,接下來就讓我們來一起了解一下這部分內容吧。

1.問題:

如下ExampleTable表,求各種類(CategoryID)滿足Flag等於1的記錄數。

ID Flag CategoryID
1 1 1
2 1 1
3 1 2
4 1 2
5 0 3

表1-ExampleTable 

理想的結果應該如下:

CategoryID TotalNum
1 2
2 2
3 0

表2-理想輸出結果

初看此問題,我們很容易寫出如下語句:

SELECT CategoryID,COUNT(1) AS TotalNum FROM ExampleTable WHERE flag = 1 GROUP BY CategoryID

可執行之後得到的結果如下:

CategoryID TotalNum
1 2
2 2

表3-錯誤輸出結果

沒有CategoryID=3,TotalNum=0的記錄。

2.原因分析:

造成以上結果的原因是因為在SELECT語句中WHERE子句先於GROUP BY執行,因此在執行GROUP BY子句時,表中的記錄已經將Category = 3的記錄過濾,分組處理中自然不會計算在內。

SQL SELECT語句完整的執行順序:

1、FROM子句組裝來自不同資料來源的資料;

2、WHERE子句基於指定的條件對記錄進行篩選;

3、GROUP BY子句將資料劃分為多個分組;

4、使用聚集函式進行計算;

5、使用HAVING子句篩選分組;

6、計算所有表示式;

7、使用ORDER BY對結果進行排序。

3.解決方案:

構造含有所有CategoeyID的結果集與其上語句所得結果集進行連線,並利用NULL替換函式(如SQL SERVER中的ISNULL()、ORACLE中的NVL())將NULL替換為0。

示例語句如下:

  1. SELECT DISTINCT MainTable.CategoryID,ISNULL(SubTable.SubNum, 0) AS TotalNum FROM ExampleTable AS MainTable LEFT JOIN  
  2. (SELECT CategoryID,COUNT(1) AS SubNum FROM ExampleTable WHERE flag = 1 GROUP BY CategoryID) AS SubTable  
  3. ON MainTable.CategoryID = SubTable.CategoryID 

執行後即可返回正確的結果:

CategoryID TotalNum
1 2
2 2
3 0

表4-正確輸出結果

以上就是SQL Server資料庫中含有GROUP BY子句的SELECT語句中顯示COUNT()為0的結果的方法,本文就介紹到這裡了,希望本次的介紹能夠對您有所收穫!

相關推薦

含有GROUP BY子句查詢如何顯示COUNT()0結果 SELECT語句完整執行順序

含有GROUP BY子句的查詢中如何顯示COUNT()為0的結果 本文我們主要介紹了SQL Server資料庫中在使用GROUP BY對查詢出的結果進行分組時,COUNT()為0的結果無法顯示的解決方法,希望能夠對您有所幫助。 在SQL Server資料庫查詢中,為

MySql含有GROUP BY子句查詢如何顯示COUNT()0結果

前階段工作中發現MySql含有GROUP BY子句的查詢中COUNT()為0的結果不顯示. 而針對於分組統計的此類問題,多數人(包括本人)通常會想到: SELECT PID,COUNT(1) AS SUM FROM SS WHERE FIAG = 1 GROUP BY PID

Mysql5.7版本group by查詢order by 無效的問題解決辦法

我們都知道group by 會選擇保留第一條資料,預設是按照id排序的,如果我們想通過別的欄位排序,比如最後建立的那條記錄,可以先按照建立時間降序,再group by即可得到每個分組的最新建立的資料。 例: 通過如下sql查出兩條資料 SELECT * FROM xxx WHERE gr

儲存過程使用sum()、count()提供因為該列沒有包含在聚合函式或 GROUP BY 子句

SELECT top 10 *, 5 totalPaidTimes, logID id, sum(paidMoney) totalPaidMoney, CONVERT(varchar(100), addTime, 120) addTimeForma

group by子句使用rollup和cube操作符

在實際應用中,利用group by 分組後可能還需要取得橫向和縱向的小計統計以及總計統計。 1、使用rollup操作符時,在保留原有的統計結果的同時,還會生成橫向小計、總計。 SELECT e.deptno,e.job,sum(e.sal),avg(sal) FROM emp e GROUP BY

在entity framework 使用 LINQ 對錶進行左關聯查詢group by 分組查詢的示例,並且按小時分組查詢時間段

有表RealTimeDatas的欄位RecordTime儲存了實時時間,格式為DateTime 現在需要以小時進行分組統計每個時間段的最大值,最小值,和平均值 同時,另一個表Devices中有標準溫度溼度最大最小值範圍,需要將這個結果一併關聯到查詢結果中    

sql語句GROUP BY 和 HAVING的使用 count()

在介紹GROUP BY 和 HAVING 子句前,我們必需先講講sql語言中一種特殊的函式:聚合函式, 例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。 SELECT SUM(population) FROM bbc 

SQL---該列沒有包含在聚合函式或 GROUP BY 子句

解決方式有2種: from語句中子查詢 根據路測ATU資料表,查詢服務小區參考訊號接收功率RSRP的均值大於-70的小區。 select cellid, avg_rsrp from

Group by 分組查詢 實戰

男女 img 通過 ont rom 出現的次數 是我 實現 一起 實戰經歷,由於本人在共享單車上班,我們的單車管理模塊,可以根據單車號查詢單車,但是單車號沒有設置unique(獨一無二約束),說以這就增加了單車號可能重復的風險,但是一般情況下,單車號是不會重復的,因為平

【15】group by子句與聚合函數

字段 min sum count() span bsp 學生 空值 查詢 1.group by簡介 -> 使用group by子句可以將數據分組-> 語法group by 字段-> 註意-> 查詢中只允許出現分組的字段或聚合函數-> 分組查詢中

MySQL Crash Course #06# Chapter 13. 14 GROUP BY. 子查詢

idt rom pla most con height bsp them 找到 索引 理解 GROUP BY 過濾數據 vs. 過濾分組 GROUP BY 與 ORDER BY 之不成文的規定 子查詢 vs. 聯表查詢 相關子查詢和不相關子查詢. 增量構造復雜

SQL group by分組查詢

create server insert 一定的 ID all 註意 至少 滿足 本文導讀:在實際SQL應用中,經常需要進行分組聚合,即將查詢對象按一定條件分組,然後對每一個組進行聚合分析。創建分組是通過GROUP BY子句實現的。與WHERE子句不同,GROUP BY

關於group by子句使用的注意事項

1、select empno,avg(sal) from emp where avg(sal)>8000 group by empno;       會報錯誤:ORA-00934: 此處不允許使用分組函式       解決

分組函式group by和Oracle分析函式partition by的用法以及區別

       今天有個同事給我打電話問我題目列出的這個問題,在日常開發中,確實它們倆都是與分組有關的,但是需要注意的是一個是分組函式另一個是分析函式,講解用到的表就以Oracle中schema的scott的EMP表和DEPT表為例做講解:        老總下命令說:需要統

sql GROUP BY子句使用例項

GROUP BY子句 GROUP BY子句可以將表的行劃分為不同的組。分別總結每個組,這樣就可以控制想要看見的詳細資訊的級別。語法: [ GROUP BY [ ALL ] group_by_expression[ ,...n ] [ WITH { CUBE | ROLLU

sqlite3學習之Limit 子句&ORDER BY 子句& GROUP BY 子句

SQLite 的 LIMIT 子句用於限制由 SELECT 語句返回的資料數量,我們來看下帶有 LIMIT 子句的 SELECT 語句的基本語法: SELECT column1, column2, columnN FROM table_name LIMIT [no of rows] 再

GROUP BY 條件查詢最新時間記錄

概述: 最近專案一個查詢需求是從一個表中同一個IP多條記錄的只獲取一條IP記錄,而這條IP記錄要最新的。很明顯需求沒什麼難,分組當然想到的是group by,但是這裡是有個時間條件篩選的。雖然網上很多答案,但是我發現實際操作上是沒有生效的,不知道是MYSQ

去除GridControl上面"Drag a column header here to group by that column"的顯示

1、開啟Run Designer,選擇Views2、在右側選擇options,並找到OptionsViews,單擊展開選項3、選擇ShowGroupPanel,修改其屬性為false即可關於如何修改表頭內容,請見我的另一篇博文:修改表頭內容

Java Dao實現group by 分組查詢功能

前言 今天要實現一個功能,去資料庫查詢一個欄位,查出該欄位有幾個不同的值,以及每個值有多少條記錄。我想到的是group by分組查詢功能,以前雖然學習過,但是沒具體去實踐,沒想到今天實現過程中糾結了很久,我把遇見的問題記錄下來供參考 實現效果 實現

資料庫排名sql,group by 分組查詢按照時間最大值

先給出類似的簡單表 DROP TABLE IF EXISTS `TouTiaoAnchor`; CREATE TABLE `TouTiaoAnchor` ( `HourId` int(10) unsigned NOT NULL, `BetinTime` varcha