日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL点滴9—使用with语句来写一个稍微复杂sql语句

發(fā)布時(shí)間:2025/3/15 数据库 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL点滴9—使用with语句来写一个稍微复杂sql语句 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天偶爾看到sql中也有with關(guān)鍵字,好歹也寫了幾年的sql語句,居然第一次接觸,無知啊。看了一位博主的文章,自己添加了一些內(nèi)容,做了簡 單的總結(jié),這個(gè)語句還是第一次見到,學(xué)習(xí)了。我從簡單到復(fù)雜地寫,希望高手們不要見笑。下面的sql語句設(shè)計(jì)到三個(gè)表,表的內(nèi)容我用txt文件復(fù)制進(jìn)去, 這里不妨使用上一個(gè)隨筆介紹的建立端到端的package的方法將這些表導(dǎo)入到數(shù)據(jù)庫中,具體的就不說了。

從這里下載文件employees.txt,customers.txt,orders.txt

參考文章:http://www.cnblogs.com/wwan/archive/2011/02/24/1964279.html

使用package導(dǎo)入數(shù)據(jù):http://www.cnblogs.com/tylerdonet/archive/2011/04/17/2017471.html

簡單的聚合

從orders表中選擇各個(gè)年份共有共有多少客戶訂購了商品

  • ?第一種寫法,我們可以寫成這樣 1select YEAR(o.orderdate) orderyear,COUNT(distinct(custid)) numCusts
    2from Sales.Orders o
    3group by YEAR(o.orderdate)
    4go 要注意的是如果把group by YEAR(o.orderdata)換成group by orderyear就會出錯(cuò),這里涉及到sql語句的執(zhí)行順序問題,有時(shí)間再了解一下          
  • 第二種寫法, 1select orderyear,COUNT(distinct(custid))numCusts
    2from (select YEAR(orderdate) as orderyear,custid from sales.orders) as D
    3group by orderyear
    4go 在from語句中先得到orderyear,然后再select語句中就不會出現(xiàn)沒有這個(gè)字段的錯(cuò)誤了
  • 第三種寫法, 1select orderyear,COUNT(distinct(custid)) numCusts
    2from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
    3group by orderyear
    4go 在as D后面加上選擇出的字段,是不是更加的清楚明了呢!
  • 第四種寫法,with出場了 1with c as(
    2select YEAR(orderdate) orderyear, custid from sales.orders)
    3select orderyear,COUNT(distinct(custid)) numCusts from c group by orderyear
    4go with可以使語句更加的經(jīng)湊,下面是權(quán)威解釋。  
        
    指定臨時(shí)命名的結(jié)果集,這些結(jié)果集稱為公用表表達(dá)式 (CTE)。該表達(dá)式源自簡單查詢,并且在單條 SELECT、INSERT、UPDATE、MERGE 或 DELETE 語句的執(zhí)行范圍內(nèi)定義。該子句也可用在 CREATE VIEW 語句中,作為該語句的 SELECT 定義語句的一部分。公用表表達(dá)式可以包括對自身的引用。這種表達(dá)式稱為遞歸公用表表達(dá)式。               

                                                        ----MSDN

  • 第五種寫法,也可以借鑒第三種寫法,這樣使語句更加清楚明了,便于維護(hù) 1 with c(orderyear,custid) as(
    2 ?select YEAR(orderdate),custid from sales.orders)
    3 ?select orderyear,COUNT(distinct(custid)) numCusts from c group by c.orderyear
    4 ?go 上面5中寫法都得到相同的結(jié)果,如下圖1:圖1
      

添加計(jì)算

  • 現(xiàn)在要求要求計(jì)算出訂單表中每年比上一年增加的客戶數(shù)目,這個(gè)稍微復(fù)雜 1 with yearcount as(
    2 select YEAR(orderdate) orderyear,COUNT(distinct(custid)) numCusts from sales.orders group by YEAR(orderdate))
    3 select cur.orderyear curyear,cur.numCusts curNumCusts,prv.orderyear prvyear,prv.numCusts prvNumCusts,cur.numCusts-prv.numCusts growth
    4 from yearcount cur left join yearcount prv on cur.orderyear=prv.orderyear+1
    5 go 這里兩次使用到with結(jié)果集。查詢得到的結(jié)果如下圖2

    圖2

復(fù)雜的計(jì)算

  • 查找所有美國雇員掌握的所有至少有一個(gè)訂單的客戶的客戶id,查詢語句如下 1 with TheseEmployees as(
    2 select empid from hr.employees where country='USA'),
    3 CharacteristicFunctions as(
    4 select custid,
    5 case when custid in (select custid from sales.orders as o where o.empid=e.empid) then 1 else 0 end as charfun
    6 from sales.customers as c cross join TheseEmployees as e)
    7 select custid,min(charfun) from CharacteristicFunctions group by custid having min(charfun)=1
    8 go 這里嵌套with語句,第with語句查找美國雇員的id,第二個(gè)語句使用這個(gè)結(jié)果和擁有客戶的客戶id和擁有關(guān)系標(biāo)識做笛卡爾積運(yùn)算。最后從這個(gè)笛卡爾積中通過標(biāo)識找到最終的custid。
    結(jié)果如下圖3

    圖3

引用至: http://www.cnblogs.com/tylerdonet/archive/2011/04/18/2020225.html


CREATE TABLE #tempTotalCBM
( Appointid int,
? TotalCBM NUMERIC
)

INSERT INTO #tempTotalCBM (Appointid,TotalCBM)
SELECT H.APPOINTID,
CAST(( CASE H.TruckerConfirm WHEN 'D' THEN SUM(D.DELIVERYCBM) ELSE SUM(D.CBM) END ) AS NUMERIC) AS TotalCBM
FROM
(
??? SELECT APPOINTID , TruckerConfirm
??? FROM CCC_TAHEADER
??? WHERE
??? DATEDIFF(D,RECEIVEDATE,'2010-10-01') <= 0
??? AND DATEDIFF(D,RECEIVEDATE,GETDATE()) >= 0
) H
INNER JOIN CCC_TADETAIL D
ON D.APPOINTID = H.APPOINTID
GROUP BY H.APPOINTID,H.TruckerConfirm

SELECT M.APPOINTID,M.LOADTYPE,N.TotalCBM,
?L_TruckSize3T, L_TruckSize5T, L_TruckSize8T, L_TruckSize10T, L_TruckSize12T,
?Size20, Size40, Size40R, Size40HQ, Size45,ReceiveDate
FROM CCC_TAHEADER M
INNER JOIN
#tempTotalCBM N
ON M.APPOINTID = N.Appointid

-- SELECT * FROM #tempTotalCBM
DROP TABLE #tempTotalCBM







with c as (
SELECT H.APPOINTID,
CAST(( CASE H.TruckerConfirm WHEN 'D' THEN SUM(D.DELIVERYCBM) ELSE SUM(D.CBM) END ) AS NUMERIC) AS TotalCBM
FROM
(
??? SELECT APPOINTID , TruckerConfirm
??? FROM CCC_TAHEADER
??? WHERE
??? DATEDIFF(D,RECEIVEDATE,'2010-10-01') <= 0
??? AND DATEDIFF(D,RECEIVEDATE,GETDATE()) >= 0
) H
INNER JOIN CCC_TADETAIL D
ON D.APPOINTID = H.APPOINTID
GROUP BY H.APPOINTID,H.TruckerConfirm
)

SELECT M.APPOINTID,M.LOADTYPE,c.TotalCBM,
?L_TruckSize3T, L_TruckSize5T, L_TruckSize8T, L_TruckSize10T, L_TruckSize12T,
?Size20, Size40, Size40R, Size40HQ, Size45,ReceiveDate
FROM CCC_TAHEADER M
INNER JOIN
c
ON M.APPOINTID = c.Appointid

轉(zhuǎn)載于:https://www.cnblogs.com/zhangchenliang/archive/2011/04/19/2021036.html

總結(jié)

以上是生活随笔為你收集整理的SQL点滴9—使用with语句来写一个稍微复杂sql语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。