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个模式对象。