sql存储过程报表,校区算出>=60岁、>=50岁、>=40岁、>=30岁和30岁以下的人数和总人数,
时间: 2024-03-09 15:51:47 浏览: 24
好的,这个需求可以通过存储过程和临时表来实现。具体步骤如下:
1. 创建存储过程并输入参数
```sql
CREATE PROCEDURE count_age_report
@start_date date,
@end_date date
AS
```
其中,@start_date和@end_date为统计起始日期和结束日期。
2. 创建临时表并初始化
```sql
CREATE TABLE #temp (
campus varchar(50),
age60 int,
age50 int,
age40 int,
age30 int,
age_under30 int,
total int
)
INSERT INTO #temp (campus, age60, age50, age40, age30, age_under30, total)
SELECT
campus,
0,
0,
0,
0,
0,
0
FROM
student
GROUP BY
campus
```
3. 查询并统计各年龄段人数
```sql
UPDATE
#temp
SET
age60 = s.age60,
age50 = s.age50,
age40 = s.age40,
age30 = s.age30,
age_under30 = s.age_under30,
total = s.total
FROM
#temp t
JOIN (
SELECT
campus,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 60 THEN 1 ELSE NULL END) AS age60,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 50 AND DATEDIFF(yy, birthdate, GETDATE()) < 60 THEN 1 ELSE NULL END) AS age50,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 40 AND DATEDIFF(yy, birthdate, GETDATE()) < 50 THEN 1 ELSE NULL END) AS age40,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 30 AND DATEDIFF(yy, birthdate, GETDATE()) < 40 THEN 1 ELSE NULL END) AS age30,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) < 30 THEN 1 ELSE NULL END) AS age_under30,
COUNT(*) AS total
FROM
student
WHERE
registration_date >= @start_date AND
registration_date <= @end_date
GROUP BY
campus
) s ON t.campus = s.campus
```
4. 返回结果
```sql
SELECT * FROM #temp
DROP TABLE #temp
```
完整的存储过程如下:
```sql
CREATE PROCEDURE count_age_report
@start_date date,
@end_date date
AS
BEGIN
CREATE TABLE #temp (
campus varchar(50),
age60 int,
age50 int,
age40 int,
age30 int,
age_under30 int,
total int
)
INSERT INTO #temp (campus, age60, age50, age40, age30, age_under30, total)
SELECT
campus,
0,
0,
0,
0,
0,
0
FROM
student
GROUP BY
campus
UPDATE
#temp
SET
age60 = s.age60,
age50 = s.age50,
age40 = s.age40,
age30 = s.age30,
age_under30 = s.age_under30,
total = s.total
FROM
#temp t
JOIN (
SELECT
campus,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 60 THEN 1 ELSE NULL END) AS age60,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 50 AND DATEDIFF(yy, birthdate, GETDATE()) < 60 THEN 1 ELSE NULL END) AS age50,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 40 AND DATEDIFF(yy, birthdate, GETDATE()) < 50 THEN 1 ELSE NULL END) AS age40,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) >= 30 AND DATEDIFF(yy, birthdate, GETDATE()) < 40 THEN 1 ELSE NULL END) AS age30,
COUNT(CASE WHEN DATEDIFF(yy, birthdate, GETDATE()) < 30 THEN 1 ELSE NULL END) AS age_under30,
COUNT(*) AS total
FROM
student
WHERE
registration_date >= @start_date AND
registration_date <= @end_date
GROUP BY
campus
) s ON t.campus = s.campus
SELECT * FROM #temp
DROP TABLE #temp
END
```
使用方法:
```sql
EXEC count_age_report '2022-01-01', '2022-12-31'
```
其中,'2022-01-01'和'2022-12-31'为起始日期和结束日期,可以根据实际情况进行修改。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)