数据如下:
table schedule:
日期, 擦黑板, 拖地, 打水
2008-05-01 A B C
2008-05-02 A C B
2008-05-03 B A C
。
table student:
编号, 姓名
A 王小明
B 李小波
C 张小月 现在想知道学生 王小明、李小波、张小月在每个月份分别擦了几次黑板、拖了几次地、打了几次水
table schedule:
日期, 擦黑板, 拖地, 打水
2008-05-01 A B C
2008-05-02 A C B
2008-05-03 B A C
。
table student:
编号, 姓名
A 王小明
B 李小波
C 张小月 现在想知道学生 王小明、李小波、张小月在每个月份分别擦了几次黑板、拖了几次地、打了几次水
解决方案 »
- 帮忙写个物化视图
- 怎样查出一个表中记录相同的数据?
- 如何远程建立数据库 菜鸟向大哥们求救了!急啊!
- 如何查询一个索引实际占用的物理空间
- 在SQL语句中获得本日所在的当月和当年的日期?
- 我要用vb看法管理ORACLE8。05的软件。我是初学者想在短期内把它搞定
- 逻辑备份能实现数据库完全恢复吗?(在线等待)重谢!
- 求助:我把一个表空间的数据文件给删了,就再也启动不了服务拉,详情请进行内
- 高手看看OLEDB问题!!!
- 谁能用简单理解的方式 解释 :什么是维度表和事实表?两者的关系是什么?
- oracle 中这样的功能要如何写trigger?
- oracle 中 sysdate 不改名,怎么进行正确sql 查询,有语句如下:
SELECT 日期, 姓名, SUM (擦黑板) 擦黑板, SUM (拖地) 拖地, SUM (打水) 打水
FROM (SELECT TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名,
SUM (a.擦黑板) 擦黑板, 0 拖地, 0 打水
FROM schedule a, student b
WHERE a.擦黑板 = b.编号
GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
UNION ALL
SELECT TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板,
SUM (a.拖地) 拖地, 0 打水
FROM schedule a, student b
WHERE a.拖地 = b.编号
GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
UNION ALL
SELECT TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板, 0 拖地,
SUM (a.打水) 打水
FROM schedule a, student b
WHERE a.打水 = b.编号
GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名)
GROUP BY 日期, 姓名
SUM (case when a.擦黑板 = b.姓名 then 1 else 0 end) 擦黑板,
SUM (case when a.拖地 = b.姓名 then 1 else 0 end) 拖地,
SUM (case when a.打水 = b.姓名 then 1 else 0 end) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
2楼好像少了点东西。where?
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
SUM (case when a.擦黑板 = b.姓名 then 1 else 0 end) 擦黑板,
SUM (case when a.拖地 = b.姓名 then 1 else 0 end) 拖地,
SUM (case when a.打水 = b.姓名 then 1 else 0 end) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
2楼的应该是最简的了把!
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
SUM (case when a.擦黑板 = b.姓名 then 1 else 0 end) 擦黑板,
SUM (case when a.拖地 = b.姓名 then 1 else 0 end) 拖地,
SUM (case when a.打水 = b.姓名 then 1 else 0 end) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
应该是最简单的。但还有种写法更简洁一些:
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
SUM (decode(a.擦黑板,b.姓名,1,0) 擦黑板,
SUM (decode(a.拖地,b.姓名,1,0) 拖地,
SUM (decode(a.打水,b.姓名,1,0) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
应该是SELECT 日期, 姓名, SUM (擦黑板) 擦黑板, SUM (拖地) 拖地, SUM (打水) 打水
FROM (SELECT TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名,
SUM (1) 擦黑板, 0 拖地, 0 打水
FROM schedule a, student b
WHERE a.擦黑板 = b.编号
GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
UNION ALL
SELECT TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板,
SUM (1) 拖地, 0 打水
FROM schedule a, student b
WHERE a.拖地 = b.编号
GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
UNION ALL
SELECT TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板, 0 拖地,
SUM (1) 打水
FROM schedule a, student b
WHERE a.打水 = b.编号
GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名)
GROUP BY 日期, 姓名
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
SUM (case when a.擦黑板 = b.姓名 then 1 else 0 end) 擦黑板,
SUM (case when a.拖地 = b.姓名 then 1 else 0 end) 拖地,
SUM (case when a.打水 = b.姓名 then 1 else 0 end) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 应该是
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
SUM (case when a.擦黑板 = b.编号 then 1 else 0 end) 擦黑板,
SUM (case when a.拖地 = b.编号 then 1 else 0 end) 拖地,
SUM (case when a.打水 = b.编号 then 1 else 0 end) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
count(dcode(a.擦黑板,b.编号,'1',null)) "擦黑板",
count(dcode(a.拖地,b.编号,'1',null)) "拖地",
count(dcode(a.打水,b.编号,'1',null)) "打水"
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
SUM (case when a.擦黑板 = b.姓名 then 1 else 0 end) 擦黑板,
SUM (case when a.拖地 = b.姓名 then 1 else 0 end) 拖地,
SUM (case when a.打水 = b.姓名 then 1 else 0 end) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 应该是
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
SUM (case when a.擦黑板 = b.编号 then 1 else 0 end) 擦黑板,
SUM (case when a.拖地 = b.编号 then 1 else 0 end) 拖地,
SUM (case when a.打水 = b.编号 then 1 else 0 end) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
decode只有oracle中有这个函数,sql2000中没有这个函数吧
GROUP BY GROUPING SETS (擦黑板, 拖地, 打水, 日期)
look this.
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
count(case when a.擦黑板 = b.编号 then a.擦黑板) 擦黑板,
count(case when a.拖地 = b.编号 then a.拖地) 拖地,
count(case when a.打水 = b.编号 then a.打水) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
SELECT TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
count(case when a.擦黑板 = b.编号 then 1111111) 擦黑板,
count(case when a.拖地 = b.编号 then 1111111) 拖地,
count(case when a.打水 = b.编号 then 1111111) 打水
FROM schedule a, student b
group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;