用最简单的方法统计出所有部门的子部门下的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用最简单的方法统计出所有部门的子部门下的数据相关的知识,希望对你有一定的参考价值。

一个部门统计表app,一个部门表。
统计表中存储了部门的一些统计信息,如工作量、应有工作量、实际工作量等
部门表中存储了各个部门的信息,主要用到部门id和上级部门id。所有等级的部门都在一个表中,想用最简单的办法求出所有二级部门下的统计信息。
比如,市教育局下有区教育局,区教育局下有各学校等,求出区教育局有多少工作量、应有工作量、实际工作量等统计信息。
注:区教育局的统计信息是各个学校统计信息的总和,而且,区有很多个,同时查询出来各个区的统计信息哦。
谢谢各位啦!!!!!!!!!

参考技术A select * from 统计表 a inner join 部门表 b on a.部门ID = b.部门ID where b.部门ID = 二级部门

意思大概是这样,不知道你的表的字段都是什麽。
有不明白的,请追问追问

你那个我也会,我是想通过一个部门id,统计出它的下级部门的统计信息,比如某区的学生数,用一条SQL语句同时统计出一个市内所有区的学生数

追答

select count(字段) as 学生数 from XXXXXX
这样不就是统计出数量了吗

追问

要是这么简单,我何必发问,一个市里面很多区,一条SQL语句分区统计出所有区下的数量,你觉得这么简单行么?
表结构问题详细描述中说的很清楚了

参考技术B 这种 “树型结构” 的查询。 不同的数据库, 实现方法不同啊。
下面就简单写一下 Oracle 与 DB2/SQL Server 的例子

树形结构统一使用下面的测试表与测试数据

CREATE TABLE test_tree (
test_id INT NOT NULL,
pid INT,
test_val VARCHAR(10),
PRIMARY KEY (test_id)
);

INSERT INTO test_tree VALUES(1, NULL, '.NET');
INSERT INTO test_tree VALUES(2, 1, 'C#');
INSERT INTO test_tree VALUES(3, 1, 'J#');
INSERT INTO test_tree VALUES(4, 1, 'ASP.NET');
INSERT INTO test_tree VALUES(5, 1, 'VB.NET');

INSERT INTO test_tree VALUES(6, NULL, 'J2EE');
INSERT INTO test_tree VALUES(7, 6, 'EJB');
INSERT INTO test_tree VALUES(8, 6, 'Servlet');
INSERT INTO test_tree VALUES(9, 6, 'JSP');

INSERT INTO test_tree VALUES(10, NULL, 'Database');
INSERT INTO test_tree VALUES(11, 10, 'DB2');
INSERT INTO test_tree VALUES(12, 10, 'mysql');
INSERT INTO test_tree VALUES(13, 10, 'Oracle');
INSERT INTO test_tree VALUES(14, 10, 'SQL Server');

INSERT INTO test_tree VALUES(15, 13, 'PL/SQL');
INSERT INTO test_tree VALUES(16, 15, 'Function');
INSERT INTO test_tree VALUES(17, 15, 'Procedure');
INSERT INTO test_tree VALUES(18, 15, 'Package');
INSERT INTO test_tree VALUES(19, 15, 'Cursor');

INSERT INTO test_tree VALUES(20, 14, 'T-SQL');

Oracle 使用 START WITH CONNECT BY 语句实现树状查询

SQL> ed
Wrote file afiedt.buf

1 SELECT
2 LPAD(' ', 2*(LEVEL-1)) || test_val AS test_val
3 FROM
4 test_tree
5 START WITH
6 test_id IN (1, 6, 10)
7* CONNECT BY PRIOR test_id = pid
SQL> /

TEST_VAL
-----------------------------------------------------------

.NET
C#
J#
ASP.NET
VB.NET
J2EE
EJB
Servlet
JSP
Database
DB2

TEST_VAL
-----------------------------------------------------------

MySQL
Oracle
PL/SQL
Function
Procedure
Package
Cursor
SQL Server
T-SQL

DB2 与 SQL Server (2005以上版本) 使用 CTE 递归来处理。

下面就仅仅列出 SQL Server 2005 的写法

使用 Common Table Expression (CTE) 来实现 递归调用。
能够计算出正确的 Level , 但是显示顺序还是略有问题。

1> WITH StepCTE
2> AS
3> (
4> SELECT
5> test_id,
6> pid,
7> test_val,
8> 1 as Lev
9> FROM
10> test_tree
11> WHERE
12> test_id IN (1,6,10)
13> UNION ALL
14> SELECT
15> T.test_id,
16> T.pid,
17> T.test_val,
18> CTE.Lev + 1
19> FROM
20> test_tree T INNER JOIN StepCTE CTE
21> ON T.pid = CTE.test_id
22> )
23> SELECT
24> test_id, pid, test_val, Lev
25> FROM StepCTE;
26> go
test_id pid test_val Lev
----------- ----------- ---------- -----------
1 NULL .NET 1
6 NULL J2EE 1
10 NULL Database 1
11 10 DB2 2
12 10 MySQL 2
13 10 Oracle 2
14 10 SQL Server 2
20 14 T-SQL 3
15 13 PL/SQL 3
16 15 Function 4
17 15 Procedure 4
18 15 Package 4
19 15 Cursor 4
7 6 EJB 2
8 6 Servlet 2
9 6 JSP 2
2 1 C# 2
3 1 J# 2
4 1 ASP.NET 2
5 1 VB.NET 2

(20 行受影响)

dir:一行代码,提取出所有视频文件名称及路径

某次,部门接到一个任务,要求对公司现有的视频文件资料做一个统计整理分类的工作。

领导召集开会,问:两周时间够用吗?

统计整理分类工作的第一步骤是把视频文件名称来源类别信息录入到 excel 表格中,才能进行下一步工作。

大家面面相觑,逐一手工复制视频文件名称粘贴至 excel 表格中,耗时费力,数据准确度也不会太高。

我自告奋勇,这一步工作我来搞定。

批处理代码:

-------------------------------------------------------

dir /s /b >>videoList.txt

------------------------------------------------------

把这一行代码保存至一txt文档后,改后缀名为 .bat,放至视频文件所有目录中运行,问题成功解决。

备注:

1.批处理的效率不是太高,后来我又用 powershell重写了代码。powershell是微软推出的下一代批处理。

2.代码检索生成的是一个包含所有视频文件名称的名为“videoList.txt"的纯文本文件,导入至 excel 电子表格中就可进行下一步的分类整理工作。

以上是关于用最简单的方法统计出所有部门的子部门下的数据的主要内容,如果未能解决你的问题,请参考以下文章

java中如何查询下面树中的的所有用户?只知道根部门的ID,如何遍历所有用户

请问如何 在MFC,用最简单的方法画出两点一线?而且要持续显示~~

递归查询该部门下所有子部门

我要取出map中所有的key或value,请用最简单、最准确的话概括,急!!!!!

用最简单的例子讲解js中解决异步的方法

用最简单的例子讲解js中解决异步的方法