请各位帮忙。看如何写编写如下SQL
有用户志愿表,保存的是用户填写的志愿:
(用户志愿表)
ID 批次 志愿代码 学校 用户
1 第一批 A 学校A 小明
2 第一批 B 学校B 小明
3 第二批 A 学校C 小明
4 第一批 A 学校A 小红
5 第一批 A 学校A 小毛
6 第一批 B 学校B 小毛
………………
用户表
ID 用户 分数
1 小明 578
2 小红 595
3 小毛 562
………………
其中用户志愿表的用户字段和用户表的用户字段关联,需要的结果是
获取某用户所有的志愿,且填报相同志愿的总人数,以及最高分和最低分
如小明查看自己填写的所有志愿,则得出如下结果
批次 志愿代码 学校 填报人数 最高分 最低分
第一批 A 学校A 3 595 562
第一批 B 学校B 2 578 562
第二批 A 学校C 1 578 578
………………
请大家帮忙,看看怎么组织SQL语句完成我描述的结果。谢谢
PS:数据库SQL SERVER 2005
------解决思路----------------------
一条语句写起来有点小复杂,使用存储过程,创建个临时表来实现,条理看起来比较清晰。
------解决思路----------------------
SELECT 批次,志愿代码,学校,填报人数,最高分,最低分
FROM (
SELECT T1.*
,COUNT(1)OVER(PARTITION BY 学校)[填报人数]
,MAX(T2.分数)OVER(PARTITION BY 学校)[最高分]
,MIN(T2.分数)OVER(PARTITION BY 学校)[最低分]
FROM 用户志愿表 T1
LEFT JOIN 用户表 T2 ON T1.用户=T2.用户
)T
WHERE 用户='小明'
------解决思路----------------------
with table1 as
(
select 1 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小明' 用户 union all
select 2 ID, '第一批' 批次, 'B' 志愿代码, '学校B' 学校, '小明' 用户 union all
select 3 ID, '第二批' 批次, 'A' 志愿代码, '学校C' 学校, '小明' 用户 union all
select 4 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小红' 用户 union all
select 5 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小毛' 用户 union all
select 6 ID, '第一批' 批次, 'B' 志愿代码, '学校B' 学校, '小毛' 用户
)
,
table2 as
(
select 1 ID, '小明' 用户, 578 分数 union all
select 2 ID, '小红' 用户, 595 分数 union all
select 3 ID, '小毛' 用户, 562 分数
)
--select * from table1 a left join table2 b on a.用户=b.用户
select a.批次, a.志愿代码, a.学校, COUNT(*) 人数, MAX(分数) 最高分, MIN(分数) 最低分 from table1 a left join table2 b on a.用户=b.用户 group by a.批次, a.志愿代码, a.学校
------解决思路----------------------
“填报相同志愿”是指(批次,志愿代码,学校)都相同吧。
WITH 用户志愿表(ID,批次,志愿代码,学校,用户) AS (
SELECT '1','第一批','A','学校A','小明' UNION ALL
SELECT '2','第一批','B','学校B','小明' UNION ALL
SELECT '3','第二批','A','学校C','小明' UNION ALL
SELECT '4','第一批','A','学校A','小红' UNION ALL
SELECT '5','第一批','A','学校A','小毛' UNION ALL
SELECT '6','第一批','B','学校B','小毛'
)
,用户表(ID,用户,分数) AS (
SELECT '1','小明',578 UNION ALL
SELECT '2','小红',595 UNION ALL
SELECT '3','小毛',562
)
SELECT A.批次, A.志愿代码, A.学校,
COUNT(*) 填报人数,
MAX(C.分数) 最高分,
MIN(C.分数) 最低分
FROM 用户志愿表 A
JOIN 用户志愿表 B
ON A.批次 = B.批次
AND A.志愿代码 = B.志愿代码
AND A.学校 = B.学校
JOIN 用户表 C
ON B.用户 = C.用户
WHERE A.用户='小明'
GROUP BY A.批次, A.志愿代码, A.学校
ORDER BY A.批次, A.志愿代码, A.学校
批次 志愿代码 学校 填报人数 最高分 最低分
------ -------- ----- ----------- ----------- -----------
第二批 A 学校C 1 578 578
第一批 A 学校A 3 595 562
第一批 B 学校B 2 578 562
------解决思路----------------------
主要是主间的三个开窗
,COUNT(1)OVER(PARTITION BY 学校)[填报人数]
,MAX(T2.分数)OVER(PARTITION BY 学校)[最高分]
,MIN(T2.分数)OVER(PARTITION BY 学校)[最低分]
PARTITION BY 学校 对学校分组进行统计 人数及最高分低分,是SQL2005的新特性,一次扫描就可以把需要的数据处理好
WHERE 用户='小明'
然后,再过滤出属于小明的数据
------解决思路----------------------
with table1 as
(
select 1 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小明' 用户 union all
select 2 ID, '第一批' 批次, 'B' 志愿代码, '学校B' 学校, '小明' 用户 union all
select 3 ID, '第二批' 批次, 'A' 志愿代码, '学校C' 学校, '小明' 用户 union all
select 4 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小红' 用户 union all
select 5 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小毛' 用户 union all
select 6 ID, '第一批' 批次, 'B' 志愿代码, '学校B' 学校, '小毛' 用户
)
,
table2 as
(
select 1 ID, '小明' 用户, 578 分数 union all
select 2 ID, '小红' 用户, 595 分数 union all
select 3 ID, '小毛' 用户, 562 分数
)
select n.* from table1 as m,
(select a.批次, a.志愿代码, a.学校, COUNT(*) 人数, MAX(分数) 最高分, MIN(分数) 最低分
from table1 a,table2 b where a.用户=b.用户 group by a.批次, a.志愿代码, a.学校) as n
where m.志愿代码=n.志愿代码 and m.学校=n.学校 and m.用户='小明'
------解决思路----------------------
with table1 as
(
select 1 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小明' 用户 union all
select 2 ID, '第一批' 批次, 'B' 志愿代码, '学校B' 学校, '小明' 用户 union all
select 3 ID, '第二批' 批次, 'A' 志愿代码, '学校C' 学校, '小明' 用户 union all
select 4 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小红' 用户 union all
select 5 ID, '第一批' 批次, 'A' 志愿代码, '学校A' 学校, '小毛' 用户 union all
select 6 ID, '第一批' 批次, 'B' 志愿代码, '学校B' 学校, '小毛' 用户
)
,
table2 as
(
select 1 ID, '小明' 用户, 578 分数 union all
select 2 ID, '小红' 用户, 595 分数 union all
select 3 ID, '小毛' 用户, 562 分数
)
select n.* from table1 as m,
(select a.批次, a.志愿代码, a.学校, COUNT(*) 人数, MAX(分数) 最高分, MIN(分数) 最低分
from table1 a,table2 b where a.用户=b.用户 group by a.批次, a.志愿代码, a.学校) as n
where m.志愿代码=n.志愿代码 and m.学校=n.学校 and m.批次=n.批次 and m.用户='小明'
这个才对,上面忘了一个条件
------解决思路----------------------
只有这一段是要给你的
SELECT A.批次, A.志愿代码, A.学校,那些是模拟数据
COUNT(*) 填报人数,
MAX(C.分数) 最高分,
MIN(C.分数) 最低分
FROM 用户志愿表 A
JOIN 用户志愿表 B
ON A.批次 = B.批次
AND A.志愿代码 = B.志愿代码
AND A.学校 = B.学校
JOIN 用户表 C
ON B.用户 = C.用户
WHERE A.用户='小明'
GROUP BY A.批次, A.志愿代码, A.学校
ORDER BY A.批次, A.志愿代码, A.学校
------解决思路----------------------
你就直接把查询语句改成你对应的数据库表和字段。
WITH 用户志愿表(ID,批次,志愿代码,学校,用户) AS (
SELECT '1','第一批','A','学校A','小明' UNION ALL
SELECT '2','第一批','B','学校B','小明' UNION ALL
SELECT '3','第二批','A','学校C','小明' UNION ALL
SELECT '4','第一批','A','学校A','小红' UNION ALL
SELECT '5','第一批','A','学校A','小毛' UNION ALL
SELECT '6','第一批','B','学校B','小毛'
)
,用户表(ID,用户,分数) AS (
SELECT '1','小明',578 UNION ALL
SELECT '2','小红',595 UNION ALL
SELECT '3','小毛',562
)
这些可以不要了