妙用SQL Server聚合函數和子查詢迭代求和

先看看下面的表和其中的數據:
t_product
該表有兩個字段:xhprice 其中xh是主索引字段,現在要得到如下的查詢結果:
?
從上面的查詢結果可以看出,totalprice字段值的規則是從第1條記錄到當前記錄的price之和。如第3條記錄的totalprice字段的值是10 + 25 + 36 = 71
現在要通過t_product表中的數據生成圖2所示的查詢結果。可能會有很多讀者想到使用循環和游標,不過這種方式效率并不高,尤其在記錄非常多的情況。
從圖2的查詢結果分析可知,這個結果仍然是求和的操作,只是并不是對所有的記錄求和,也不是分組求和,而是使用迭代的方式進行求和,求和的公式如下:
當前記錄的totalprice = 當前記錄的price + 上一條記錄totalprice
上一條記錄的totalprice值也可看成是當前記錄以前所有記錄的price值之和。因此,可以對每一條記錄進行求和(使用sum函數),不過要求出當前記錄及以前的記錄的price之和,如下面的SQL語句:
select?a.xh,?a.price,
(
select?sum(price)?from?t_product?b?where?b.xh?<=?a.xh)?as?totalprice?
from?t_product?a
從上面的SQL語句可以看出,使用了一個子查詢來求totalprice字段的值,基本原理就是根據當前記錄的xh值(a.xh)來計算從當前記錄往前所有記錄的price值之和,b.xh表示子查詢當前的xh值,在子查詢中,a.xh相當于常量。上面的SQL語句的查詢結果和圖2完全一樣。如果我們的需求是不包含當前記錄的price值,也就是說,計算totalprice字段的公式如下:
當前記錄的totalprice = 上一條當前記錄的price + 上一條記錄的totalprice
第一條記錄的totalprice值就是當前記錄的price值,查詢t_product表的結果如圖3所示。
要查詢出上述的記錄也很容易,只需要將<=改成<即可,SQL語句如下:

?
select?a.xh,?a.price,
(
select?sum(price)?from?t_product?b?where?b.xh?<?a.xh)?as?totalprice?
from?t_product?a
但上面的SQL查詢出來的記錄的第一條的totalprice字段值為null,如圖4所示。
?
為了將這個null換成10,可以使用case語句,SQL語句如下:

?
select?xh,?price,?
(
case??when?totalprice?is?null?then?price?else?totalprice?end?)?as?totalprice
from
(
select?a.xh,?(select??sum(price)?from?t_product?b?where?b.xh?<?a.xh)??as?totalprice?,?a.price
from?t_product?a)??x
在上面的SQL語句共有三層select查詢,最里面一層如下:
select??sum(price)?from?t_product?b?where?b.xh?<?a.xh)
中間一層的子查詢如下:
select?a.xh,?(select??sum(price)?from?t_product?b?where?b.xh?<?a.xh)??as?totalprice?,?a.price
from?t_product?a
最外面一層當然就是整個select語句了。
在執行上面的SQL后,將會得到和圖3一樣的查詢結果了。
如果讀者不喜歡寫太長的SQL,可以將部分內容寫到函數里,代碼如下:
create?function?mysum(@xh?int,?@price?int)?returns?int
begin
??
return?(select?
??????????(
case?when?totalprice?is?null?then?@price??else?totalprice?end)?as?totalprice?
?????????
from?(?select??sum(price)?as?totalprice?from?t_product?where?xh?<?@xh)?x)
end
可使用下面的SQL語句來使用這個函數:
select?xh,?price,?dbo.mysum(xh,?price)??as?totalprice
from?t_product
在執行上面的SQL后,將得出如圖3所示的查詢結果。
建立t_product表的SQL語句(SQL Server 2005)如下:
SET?ANSI_NULLS?ON
GO
SET?QUOTED_IDENTIFIER?ON
GO
IF?NOT?EXISTS?(SELECT?*?FROM?sys.objects?WHERE?object_id?=?OBJECT_ID(N'[dbo].[t_product]')?AND?type?in?(N'U'))
BEGIN
CREATE?TABLE?[dbo].[t_product](
????
[xh]?[int]?NOT?NULL,
????
[price]?[int]?NOT?NULL,
?
CONSTRAINT?[PK_t_product]?PRIMARY?KEY?CLUSTERED?
(
????
[xh]?ASC
)
WITH?(IGNORE_DUP_KEY?=?OFF)?ON?[PRIMARY]
)?
ON?[PRIMARY]
END
?
《銀河系列原創教程》發布
《Java Web開發速學寶典》出版,歡迎定購

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記一次.NET某工控圖片上傳CPU爆高分析

一&#xff1a;背景 1.講故事今天給大家帶來一個入門級的 CPU 爆高案例&#xff0c;前段時間有位朋友找到我&#xff0c;說他的程序間歇性的 CPU 爆高&#xff0c;不知道是啥情況&#xff0c;讓我幫忙看下&#xff0c;既然找到我&#xff0c;那就用 WinDbg 看一下。二&#xff…

微信小程序項目實踐準備工作

微信小程序項目實踐準備工作一、了解微信小程序產品定位及功能介紹微信小程序是一種全新的連接用戶與服務的方式&#xff0c;它可以在微信內被便捷地獲取和傳播&#xff0c;同時具有出色的使用體驗。簡單的說&#xff0c;小程序是微信附屬產品&#xff0c;需要依賴微信&#xf…

VSCode 用戶自定義片段 snippet 基本語法說明

先上一個官方模板&#xff1a; "Print to console": {"prefix": "log","body": ["console.log($1);","$2"],"description": "Log output to console" }prefix 前綴&#xff0c;emmet 觸發條…

Python集合和函數

深淺拷貝&#xff1a;.copy()方法&#xff0c;淺拷貝值拷貝一層。列表中的列表和字典會深拷貝&#xff0c;其他類型會淺拷貝。列表中的列表和字典會隨著副本的修改而改變&#xff0c;其他類型不會隨著副本的改變為改變。ab不是復制&#xff0c;是兩個變量共享同一內存空間&…

從 WinDbg 角度理解 .NET7 的AOT玩法

一&#xff1a;背景 1.講故事前幾天 B 站上有位朋友讓我從高級調試的角度來解讀下 .NET7 新出來的 AOT&#xff0c;畢竟這東西是新的&#xff0c;所以這一篇我就簡單摸索一下。二&#xff1a;AOT 的幾個問題 1. 如何在 .NET7 中開啟 AOT 功能在 .NET7 中開啟 AOT 非常方便&…

.NET Core C#系列之XiaoFeng.ToCast萬能類型轉換器

數據類型相互轉換如&#xff1a;字符串轉整型&#xff0c;字符串轉日期首先要引用 XiaoFeng命名空間下邊三個擴展方法 就是類型轉換的方法最常用的就是 ToCast<T>方法/// <summary> /// 類型相互轉換 /// </summary> /// <typeparam name"T">…

利用 Git OpenSSH 查看/生成 本機 ssh 公鑰

查看本機公鑰 本機公鑰文件一般用戶目錄下的.ssh文件夾&#xff0c;文件夾下有三個文件&#xff0c;分別是 id_rsa 私鑰密碼id_rsa.pub 公鑰內容known_hosts 允許的host地址 使用文本編輯器查看文件id_rsa.pub文件即可 或者使用cat命令查看 # 任意位置打開 Git bash cd ~/.…

高斯消元法

有點線代的知識&#xff1a; const double EPS 1e-8; typedef vector<double> vec; typedef vector<vec> mat; //Ax b vec gauss_jordan(const mat &A, const vec &b) {int n A.size();mat B(n,vec(n1)); //定義大小for(int i0;i < n;i)for(int j0…

判斷對象是否存在某個屬性

JavaScript判斷對象是否存在某個屬性或者方法&#xff0c;常用方法有兩種hasOwnProperty和in hasOwnProperty是Object原型對象上的一個方法&#xff0c;用來判斷對象自身屬性中是否具有指定的屬性。 這個方法可以用來檢測一個對象是否含有特定的自身屬性&#xff1b;和 in 運…

【PPT】適配器模式 和 橋接模式

【PPT】適配器模式 和 橋接模式目錄【PPT】適配器模式 和 橋接模式一、PPT 截圖1.0、封面和目錄1.1、設計模式概述1.2、結構型模式特點1.3、適配器模式1.4、橋接模式二、參考資料及 PPT 獲取方法獨立觀察員 2022 年 11 月 15 日為之前公司準備的分享PPT&#xff0c;后來沒用上。…

Flask 【第七篇】Flask中的wtforms使用

一、簡單介紹flask中的wtforms WTForms是一個支持多個web框架的form組件&#xff0c;主要用于對用戶請求數據進行驗證。 安裝&#xff1a; pip3 install wtforms 二、簡單使用wtforms組件 1、用戶登錄 具體代碼&#xff1a; from flask import Flask,render_template,request,…

CSS自定義滾動條樣式

css通過滾動條偽類來修改滾動條樣式&#xff0c;偽類名稱如下 ::-webkit-scrollbar 滾動條整體部分 ::-webkit-scrollbar-track 滾動條軌道&#xff08;里面裝有滑塊 thumb&#xff09; ::-webkit-scrollbar-thumb 滾動條滑塊 ::-webkit-scrollbar-button 滾動條軌道兩端按鈕 …

為了避免內存攻擊,美國國家安全局提倡Rust、C#、Go、Java、Ruby 和 Swift,但將 C 和 C++ 置于一邊...

本文翻譯自兩篇文章&#xff0c;第一篇是對美國國家安全局在“軟件內存安全”網絡安全信息表的解讀&#xff0c;第二篇是普及什么是內存安全&#xff0c;為什么它很重要&#xff1f;第一篇 為了避免內存攻擊&#xff0c;美國國家安全局提倡Rust、C#、Go、Java、Ruby 和 Swift&a…

自學python(一)

一、入門儀式 學習一門新語言必不可少的一件事&#xff1a; print("Hello world!")二、基礎知識 1、注釋&#xff1a; 單行注釋&#xff1a; 1 print("Hello world!") #輸出Hello world! 多行注釋&#xff1a; 這是多行注釋 這是多行注釋 這是多行注釋…

.NET周報【11月第2期 2022-11-15】

國內文章統一的開發平臺.NET 7正式發布https://www.cnblogs.com/shanyou/archive/2022/11/09/16871945.html在 2020 年規劃的.NET 5功能終于在.NET 7 完成了&#xff0c;為微軟和社區一起為多年來將不同的開發產品統一起來的努力加冕&#xff0c;未來只有一個.NET, 回顧.NET 20…

如何像使用AspNetCore中的Controllers 和 Actions一樣處理MQTT消息

在物聯網項目中&#xff0c; 處理MQTT的topic時費工費力&#xff0c; 代碼一團亂&#xff0c; 什么才是最好的姿勢&#xff1f;這里面我們極力介紹 MQTTnet.AspNetCore.Routing 項目&#xff0c;MQTTnet AspNetCore Routing 是https://github.com/Atlas-LiftTech/MQTTnet.AspN…

chrome 懸停大圖插件_Google Chrome瀏覽器的懸停卡:我不想要的我最喜歡的新東西

chrome 懸停大圖插件If you only have a handful of open tabs in Google Chrome, it’s easy to tell what they are. But as you start to collect more tabs (or make the window smaller), it gets harder. That’s where Hover Cards come in. 如果您在Google Chrome瀏覽器…

GitHub Codespaces 安裝 .NET 7

本文主要介紹如何在 GitHub Codespaces 這個云上 IDE 環境中安裝 .NET 7背景GitHub 的 Codespaces 可以讓我們隨時隨地編寫代碼&#xff0c;一些簡單的修改也非常方便快捷。特別是 .NET 7 發布后&#xff0c;一些可以直接升級的小項目只需要更改配置就可以了&#xff0c;我們可…

chrome怎么隱藏瀏覽器_如何使用Google Chrome的隱藏閱讀器模式

chrome怎么隱藏瀏覽器Chrome 75 has a hidden “Reader” mode that strips web pages down to the bare minimum to make them easier to, well, read. But it’s not enabled by default—here’s how to get it now. Chrome 75具有隱藏的“閱讀器”模式&#xff0c;可將網頁…

angularjs中使用swiper時不起作用,最后出現空白位

controller.js中定義swipers指令&#xff1a; var moduleCtrl angular.module(newscontroller,[infinite-scroll,ngTouch,news.service]) .directive(swipers,swipers); swipers.$inject [$timeout]; function swipers($timeout) {return {restrict: "EA",scope: {…