sql層級
『壹』 sql server 遞歸匯總 按指定層級匯總
--測試數據
witharea(id,"name",f_id,leve)as(
select1,'中國',0,1unionall
select2,'湖北',1,2unionall
select3,'武漢',2,3unionall
select4,'雲貴',1,2unionall
select5,'雲南',4,3unionall
select6,'貴陽',4,3unionall
select7,'雲南子區',5,4unionall
select8,'貴陽子區',6,4unionall
select9,'蔡甸',2,3
),"table"(id,area_id,"money")as(
select1,3,10unionall
select2,9,5unionall
select3,7,20unionall
select4,8,30
)
--使用cte遞歸求出每個節點的路徑
,t(id,f_id,"name","level",fullpath)as(
selecta.id,a.f_id,a."name",a.leve,cast(a.idasvarchar(max))
fromareaa
wherea.leve=1
unionall
selectb.id,b.f_id,b."name",b.leve,t.fullpath+'->'+cast(b.idasvarchar(max))
fromareab
innerjointont.id=b.f_id
)
--匯總統計每個節點的金額
selectt.id,t."name",t."level",sum(c."money")as"money"
fromt
innerjointt1oncharindex(t.fullpath,t1.fullpath)=1
innerjoin"table"conc.area_id=t1.id
groupbyt.id,t."name",t."level"
havingt."level"=2--篩選出第二層級
orderbyt.id
結果:
『貳』 SQL樹形層級查詢
你好的!
oracle 的start with connect by
別的資料庫用cte 遞歸都能達到你要的效果!
望採納~
『叄』 急求:SQL層級匯總的語句
CREATE TABLE table1 (
id INT,
name VARCHAR(10),
f_id INT
);
GO
INSERT INTO table1
SELECT 1 , 'a ', 0 UNION ALL
SELECT 2 , 'b ', 0 UNION ALL
SELECT 3 , 'a.1 ', 1 UNION ALL
SELECT 4 , 'a.2 ', 1 UNION ALL
SELECT 5 , 'a.1.1 ', 3 UNION ALL
SELECT 6 , 'a.1.2 ', 3 UNION ALL
SELECT 7 , 'a.2.1 ', 4 UNION ALL
SELECT 8 , 'a.2.2 ', 4 UNION ALL
SELECT 9 , 'a.1.1.1', 5 UNION ALL
SELECT 10, 'a.1.1.2', 5 UNION ALL
SELECT 11, 'a.1.2.1', 6 UNION ALL
SELECT 12, 'a.1.2.2', 6 UNION ALL
SELECT 13, 'a.2.1.1', 7 UNION ALL
SELECT 14, 'a.2.1.2', 7 UNION ALL
SELECT 15, 'a.2.2.1', 8 UNION ALL
SELECT 16, 'a.2.2.2', 8;
GO
CREATE TABLE table2 (
id INT,
t_id INT,
price DECIMAL(5,2)
);
GO
INSERT INTO table2
SELECT 1, 9 , 10.00 UNION ALL
SELECT 2, 10, 5.00 UNION ALL
SELECT 3, 11, 2.00 UNION ALL
SELECT 4, 12, 3.00 UNION ALL
SELECT 5, 13, 4.00 UNION ALL
SELECT 6, 14, 6.50 UNION ALL
SELECT 7, 15, 3.20 UNION ALL
SELECT 8, 16, 4.00
GO
WITH baseQuery
AS (
SELECT
table1.id,
table1.name,
table1.f_id,
ISNULL(table2.price, 0.00) AS price
FROM
table1 LEFT JOIN table2 ON (table1.id = table2.t_id)
), treeCTE
AS (
SELECT
id, name, f_id, price
FROM
baseQuery
WHERE
NOT EXISTS (
SELECT 1
FROM table1
WHERE table1.f_id = baseQuery.id
)
UNION ALL
SELECT
baseQuery.id,
baseQuery.name,
baseQuery.f_id,
CAST(baseQuery.price + treeCTE.price as DECIMAL(5,2))
FROM
baseQuery JOIN treeCTE ON (baseQuery.id = treeCTE.f_id)
)
select
id,
name,
SUM(price) AS price
from
treeCTE
GROUP BY
id,
name
ORDER BY
id
id name price
----------- ---------- ---------------------------------------
1 a 37.70
2 b 0.00
3 a.1 20.00
4 a.2 17.70
5 a.1.1 15.00
6 a.1.2 5.00
7 a.2.1 10.50
8 a.2.2 7.20
9 a.1.1.1 10.00
10 a.1.1.2 5.00
11 a.1.2.1 2.00
12 a.1.2.2 3.00
13 a.2.1.1 4.00
14 a.2.1.2 6.50
15 a.2.2.1 3.20
16 a.2.2.2 4.00
(16 行受影響)
『肆』 sql server實例和資料庫的區別是什麼
一個資料庫中包含存儲真正數據的多個表結構,而一個實例包含多個資料庫,一台伺服器(硬體)可以包含多個實例。
每個實例是一個SQL Server安裝的組件(或資料庫引擎的程序,工具和相關程序)。每個用戶資料庫(和表)通過編寫代碼,使用的工具,復制/恢復現有資料庫而創建。當安裝SQL Server程序時,可以通過命名在一台機器上安裝不同的實例。例如,你可以有SQL2005,SQL2008,SQL2012作為SQL Server獨立的命名實例。也可以用相同的版本安裝成不同的實例,如SQL2005DW(用於數據倉庫),SQL2005_PAY(工資單),SQL2005_ERP等等。
可以有一個(並且唯一)被稱為默認實例的實例,在同一台機器上所有其他實例必須有一個名稱(16個字元)。
該程序之間(SQL Server資料庫引擎)互相競爭機器資源,所以你必須了解和管理每個實例將如何競爭,否則它們會機器運行變慢甚至停止。
可能更常見的是一個實例中存在多個資料庫。每個實例都有」系統「資料庫(MASTER,MODEL,RESOURCES,MSDB,TEMPDB),然後您可以在該實例中創建自己的用戶資料庫。
在管理伺服器資源方面,你可以管理每個實例需要多少內存和CPU。但是對於一個實例中的資料庫,卻不能這樣做。
可以在實例或資料庫兩個層級上應用安全和訪問限制。雖然有時業務可能更偏向將高度敏感/涉及安全的數據作為一個單獨的實例(如薪資資料庫),以避免任何危險。
當連接到一個資料庫,必須同時提供實例名稱和資料庫名稱。
『伍』 SQL要怎麼寫才能把 按員工查出他所在部門所有層級關系 。
WITHB1AS(
SELECT部門名稱,部門名稱一級部門,''二級部門,''三級部門,''四級部門,''五級部門FROM部門表WHERE層級=0),
B2AS(
SELECTB.部門名稱,B1.一級部門,B.部門名稱二級部門,''三級部門,''四級部門,''五級部門FROMB1JOIN部門表BONB.上級部門ID=B1.部門名稱WHEREB.層級=1),
B3AS(
SELECTB.部門名稱,B2.一級部門,B2.二級部門,B.部門名稱三級部門,''四級部門,''五級部門FROMB2JOIN部門表BONB.上級部門ID=B2.部門名稱WHEREB.層級=2),
B4AS(
SELECTB.部門名稱,B3.一級部門,B3.二級部門,B3.三級部門,B.部門名稱四級部門,''五級部門FROMB3JOIN部門表BONB.上級部門ID=B3.部門名稱WHEREB.層級=3),
B5AS(
SELECTB.部門名稱,B4.一級部門,B4.二級部門,B4.三級部門,B4.四級部門,B.部門名稱五級部門FROMB4JOIN部門表BONB.上級部門ID=B4.部門名稱WHEREB.層級=4),
BAS(
SELECT*FROMB1
UNIONALL
SELECT*FROMB2
UNIONALL
SELECT*FROMB3
UNIONALL
SELECT*FROMB4
UNIONALL
SELECT*FROMB5)
SELECTID,姓名,一級部門,二級部門,三級部門,四級部門,五級部門FROMBJOIN員工表YONY.部門=B.部門名稱
『陸』 有層級的,怎麼用sql查詢返回結果
層次化查詢,即樹型結構查詢,是SQL中經常用到的功能之一,通常由根節點,父節點,子節點,葉節點組成,其語法如下:
SELECT [LEVEL] ,column,expression,...
FROM table_name
[WHERE where_clause]
[[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];
LEVEL:偽列,用於表示樹的層次
start_condition:層次化查詢的起始條件,指定階層的根。
prior_condition:定義父節點和子節點之間的關系,PRIOR指定父節點。作為運算符,PRIOR和加(+)減(-)運算的優先順序相同。condition ... PRIOR expr = expr 或者 ... expr = PRIOR expr
例:
CONNECT BY last_name != 'King' AND PRIOR employee_id = manager_id ...
CONNECT BY PRIOR employee_id = manager_id and PRIOR account_mgr_id = customer_idSYS_CONNECT_BY_PATH
SYS_CONNECT_BY_PATH這個函數是oracle9i才新提出來的!
它一定要和connect by子句合用!
第一個參數是形成樹形式的欄位,第二個參數是父級和其子級分隔顯示用的分隔符!
『柒』 sql語句顯示層級
declare @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山東省'
UNION ALL SELECT '002','001','煙台市'
UNION ALL SELECT '004','002','招遠市'
UNION ALL SELECT '003','001','青島市'
UNION ALL SELECT '005',NULL ,'四會市'
UNION ALL SELECT '006','005','清遠市'
UNION ALL SELECT '007','006','小分市'
;with cte as
(
select ID,name,level=0 from @t where PID is null
union all
select p.id,p.name ,level=level+1 from @t p join cte c on p.PID = c.ID
)
SELECT SPACE(Level*2)+''+Name
FROM cte
ORDER BY id
/*
山東省
煙台市
青島市
招遠市
四會市
清遠市
小分市
(7 行受影響)*/
『捌』 SQL的層次結構
sql環境包括目錄1至目錄N,目錄又包括信息模式和模式1至模式2,模式還包括11個模式對象。