數據庫單表關聯實現數據計數功能(表格自身關聯)
注:本博文為博主原創,轉載請注明出處。
問題提出:在數據庫中有這樣一張表格,其中主要包含三個字段,GoodsId(貨物編號),TypeId(類型編號),State(狀態)。貨物編號不重復,GoodsId與TypeId之間屬於N對1的關系,State為狀態主要分為兩種“null”和“1”,“null”表示該貨物未賣出UnSold,“1”表示貨物Sold。現在有如下業務,統計出類型編號下有多少貨物Sold,多少貨物UnSold。
數據庫中的表格數據如下:
最后需要統計出(輸出)的結果為:
問題分析:在上述問題中無疑所要用到的重點就是表格自身關聯,以及計數方法count函數,以及分組group by等。在此根據題目提出的問題,我們需要用到的表格連接方法為內連接(inner join)。因為在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。
問題解決:根據所描述的問題,以及對於問題的分析,設計了如下sql。
1 select g1.TypeId,count(*)AS Sold,g3.UnSold from Goods g1 2 inner join 3 (select TypeId,count(*)AS UnSold from Goods g2 WHERE State='null' 4 group by g2.TypeId) g3 5 on g1.TypeId = g3.TypeId 6 WHERE State ='1' group by g1.TypeId,g3.UnSold
附件:為了讓大家更好的去實踐,博主特將建表語句以及插入語句貼出。以供大家學習。
1 -- 建表語句 2 CREATE TABLE Goods( 3 GoodsId VARCHAR(255), 4 TypeId VARCHAR(255), 5 State VARCHAR(255) 6 ); 7 8 --- 插入語句 9 insert into Goods(GoodsId,TypeId,State) values('001','1','1'); 10 insert into Goods(GoodsId,TypeId,State) values('002','1','null') 11 insert into Goods(GoodsId,TypeId,State) values('003','1','null'); 12 insert into Goods(GoodsId,TypeId,State) values('004','1','null'); 13 insert into Goods(GoodsId,TypeId,State) values('005','1','null'); 14 insert into Goods(GoodsId,TypeId,State) values('006','1','1'); 15 insert into Goods(GoodsId,TypeId,State) values('001','2','1'); 16 insert into Goods(GoodsId,TypeId,State) values('002','2','null'); 17 insert into Goods(GoodsId,TypeId,State) values('003','2','null'); 18 insert into Goods(GoodsId,TypeId,State) values('004','2','1'); 19 insert into Goods(GoodsId,TypeId,State) values('005','2','null'); 20 insert into Goods(GoodsId,TypeId,State) values('006','2','null'); 21 insert into Goods(GoodsId,TypeId,State) values('007','2','1'); 22 insert into Goods(GoodsId,TypeId,State) values('008','2','null'); 23 insert into Goods(GoodsId,TypeId,State) values('001','3','1'); 24 insert into Goods(GoodsId,TypeId,State) values('002','3','null'); 25 insert into Goods(GoodsId,TypeId,State) values('003','3','null');