在出產系統中,一個大訂單凡是會拆分為良多的小訂單,每個訂單的數目都不不異,那么,若何才能在訂單明細表中,按照訂單號,對總的訂單數目進行篩選呢?
建立一個姑且表,用于演示sqlserver數據庫中,若何在訂單表上,先分類統計,然后再次篩選數據
IF OBJECT_ID('tempdb..#tblOrder') IS NOT NULL DROP TABLE #tblOrder;
CREATE TABLE #tblOrder(
OrderID varchar(50), -- 訂單號
OrderLine int, -- 訂單行號
OrderTotal int -- 訂單數目
);
 往姑且表中1插入幾行測試數據,模訂定單數據,此處假設是訂單明細數據,所以訂單號是可以反復的
insert into #tblOrder(OrderID, OrderLine, OrderTotal) values('PO00001', 1, 1000);
insert into #tblOrder(OrderID, OrderLine, OrderTotal) values('PO00001', 2, 2000);
insert into #tblOrder(OrderID, OrderLine, OrderTotal) values('PO00001', 3, 3000);
insert into #tblOrder(OrderID, OrderLine, OrderTotal) values('PO00002', 1, 4000);
insert into #tblOrder(OrderID, OrderLine, OrderTotal) values('PO00003', 1, 5000);
 查詢姑且表1中的測試數據
select * from #tblOrder;
 按照訂單號匯總所有的數目,這個時辰就需要利用到group by分組語句,以及sum統計函數
select '訂單號' = OrderID, '總數目' = sum(OrderTotal)
from #tblOrder
group by OrderID
 在匯總完當作訂單數目的根本上,若何篩選出總訂單數跨越4000的訂單號以及數目呢?最簡單的體例就是,嵌套SQL,再次篩選,實現體例如下
select '訂單號' = tmp.OrderID, '總數目' = tmp.OrderTotal
from(
select OrderID, OrderTotal = sum(OrderTotal)
from #tblOrder
group by OrderID
)tmp
where tmp.OrderTotal > 4000
 固然,上面的SQL也實現了需求,可是,看起來SQL語句較多。若何才能不利用嵌套SQL呢?先看下面的SQL,概況上看起來,有點像這么回事,可是,現實卻達不到結果。下面的SQL統計的是,訂單明細數目大于4000的值匯總,而不是總訂單數目大于4000的訂單數目匯總
select '訂單號' = OrderID, '總數目' = sum(OrderTotal)
from #tblOrder
where OrderTotal > 4000
group by OrderID
 當現實營業再復雜一些,獲取的字段再多一些的時辰,不想利用嵌套SQL的時辰,就可以利用having語句了
select '訂單號' = OrderID, '總數目' = sum(OrderTotal)
from #tblOrder
group by OrderID
having sum(OrderTotal) > 4000
 0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!