楼主: newkid

SQL 小测验每周一题

[复制链接]
招聘 : 数据工程师
论坛徽章:
92
生肖徽章2007版:鸡
日期:2013-11-12 07:55:03马上有房
日期:2014-02-18 16:42:02马上有钱
日期:2014-04-09 17:17:412014年世界杯参赛球队: 美国
日期:2014-06-28 21:46:122014年世界杯参赛球队:喀麦隆
日期:2014-07-07 10:46:48马上有车
日期:2014-07-21 13:04:39马上加薪
日期:2014-07-29 10:04:19马上有对象
日期:2014-07-29 10:04:53马上有车
日期:2014-07-29 10:04:20马上加薪
日期:2014-08-26 22:26:06
11#
发表于 2011-11-1 14:51 | 只看该作者
ad

使用道具 举报

回复
招聘 : 数据工程师
论坛徽章:
92
生肖徽章2007版:鸡
日期:2013-11-12 07:55:03马上有房
日期:2014-02-18 16:42:02马上有钱
日期:2014-04-09 17:17:412014年世界杯参赛球队: 美国
日期:2014-06-28 21:46:122014年世界杯参赛球队:喀麦隆
日期:2014-07-07 10:46:48马上有车
日期:2014-07-21 13:04:39马上加薪
日期:2014-07-29 10:04:19马上有对象
日期:2014-07-29 10:04:53马上有车
日期:2014-07-29 10:04:20马上加薪
日期:2014-08-26 22:26:06
12#
发表于 2011-11-1 14:54 | 只看该作者
abdf

使用道具 举报

回复
论坛徽章:
11
SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:03:45红孩儿
日期:2012-12-19 11:08:17优秀写手
日期:2013-12-18 09:29:09暖羊羊
日期:2015-04-22 14:41:41
13#
发表于 2011-11-1 14:56 | 只看该作者
没底,去验证下。。。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
14#
 楼主| 发表于 2011-11-1 22:31 | 只看该作者
luyi6101 发表于 2011-11-1 14:54
abdf

回答正确。

2011-6-25 GROUPING SETS

作者:Kim Berg Hansen
难度:中

我创建了如下的表并填入数据:
CREATE TABLE plch_sales
(
   product     VARCHAR2(10)
, country     VARCHAR2(10)
, year        NUMBER
, sales       NUMBER
)
/

BEGIN
   INSERT INTO plch_sales VALUES ('BANANA', 'US', 2009, 200);
   INSERT INTO plch_sales VALUES ('BANANA', 'US', 2010, 300);
   INSERT INTO plch_sales VALUES ('BANANA', 'GB', 2009, 400);
   INSERT INTO plch_sales VALUES ('BANANA', 'GB', 2010, 350);
   INSERT INTO plch_sales VALUES ('BANANA', 'DK', 2010, 250);
   INSERT INTO plch_sales VALUES ('APPLE' , 'US', 2009, 100);
   INSERT INTO plch_sales VALUES ('APPLE' , 'GB', 2009, 150);
   INSERT INTO plch_sales VALUES ('APPLE' , 'GB', 2010, 150);
   INSERT INTO plch_sales VALUES ('APPLE' , 'DK', 2009, 250);
   INSERT INTO plch_sales VALUES ('APPLE' , 'DK', 2010, 250);
   INSERT INTO plch_sales VALUES ('PEAR'  , 'GB', 2010, 150);
   INSERT INTO plch_sales VALUES ('PEAR'  , 'DK', 2009, 300);
   INSERT INTO plch_sales VALUES ('PEAR'  , 'DK', 2010, 350);

   COMMIT;
END;
/

我的老板要我按照产品、国家汇总销售数据,最后必须有总合计。

哪个选项能够产生符合要求的如下输出:
TOTAL   PRODUCT    COUNTRY         SALES
------- ---------- ---------- ----------
Product APPLE      TOTAL             900
Product BANANA     TOTAL            1500
Product PEAR       TOTAL             800
Country TOTAL      DK               1400
Country TOTAL      GB               1200
Country TOTAL      US                600
Grand   TOTAL      TOTAL            3200

(A)
SELECT 'Product' total
     , CASE GROUPING(s.product)
         WHEN 1 THEN 'TOTAL'
         ELSE s.product
       END product
     , 'TOTAL' country
     , SUM(s.sales) sales
FROM plch_sales s
GROUP BY s.product
UNION ALL
SELECT 'Country' total
     , 'TOTAL' product
     , CASE GROUPING(s.country)
         WHEN 1 THEN 'TOTAL'
         ELSE s.country
       END country
     , SUM(s.sales) sales
FROM plch_sales s
GROUP BY s.country
UNION ALL
SELECT 'Grand' total
     , 'TOTAL' product
     , 'TOTAL' country
     , SUM(s.sales) sales
FROM plch_sales s
ORDER BY product, country;

(B)
SELECT * FROM (
   SELECT 'Product' total
        , CASE GROUPING(s.product)
            WHEN 1 THEN 'TOTAL'
            ELSE s.product
          END product
        , 'TOTAL' country
        , SUM(s.sales) sales
   FROM plch_sales s
   GROUP BY s.product
   ORDER BY s.product
)
UNION ALL
SELECT * FROM (
   SELECT 'Country' total
        , 'TOTAL' product
        , CASE GROUPING(s.country)
            WHEN 1 THEN 'TOTAL'
            ELSE s.country
          END country
        , SUM(s.sales) sales
   FROM plch_sales s
   GROUP BY s.country
   ORDER BY s.country
)
UNION ALL
SELECT 'Grand' total
     , 'TOTAL' product
     , 'TOTAL' country
     , SUM(s.sales) sales
FROM plch_sales s;

(C)
SELECT CASE GROUPING_ID(s.product, s.country)
         WHEN 1 THEN 'Product'
         WHEN 2 THEN 'Country'
         WHEN 3 THEN 'Grand'
       END total
     , CASE GROUPING(s.product)
         WHEN 1 THEN 'TOTAL'
         ELSE s.product
       END product
     , CASE GROUPING(s.country)
         WHEN 1 THEN 'TOTAL'
         ELSE s.country
       END country
     , SUM(s.sales) sales
FROM plch_sales s
GROUP BY ROLLUP(s.product, s.country)
ORDER BY s.product, s.country;

(D)
SELECT CASE GROUPING_ID(s.product, s.country)
         WHEN 1 THEN 'Product'
         WHEN 2 THEN 'Country'
         WHEN 3 THEN 'Grand'
       END total
     , CASE GROUPING(s.product)
         WHEN 1 THEN 'TOTAL'
         ELSE s.product
       END product
     , CASE GROUPING(s.country)
         WHEN 1 THEN 'TOTAL'
         ELSE s.country
       END country
     , SUM(s.sales) sales
FROM plch_sales s
GROUP BY GROUPING SETS(
   (s.product),
   (s.country),
   ()
)
ORDER BY s.product, s.country;

(E)
SELECT CASE GROUPING_ID(s.product, s.country)
         WHEN 1 THEN 'Product'
         WHEN 2 THEN 'Country'
         WHEN 3 THEN 'Grand'
       END total
     , CASE GROUPING(s.product)
         WHEN 1 THEN 'TOTAL'
         ELSE s.product
       END product
     , CASE GROUPING(s.country)
         WHEN 1 THEN 'TOTAL'
         ELSE s.country
       END country
     , SUM(s.sales) sales
FROM plch_sales s
GROUP BY CUBE(s.product, s.country)
HAVING GROUPING_ID(s.product, s.country) > 0
ORDER BY s.product, s.country;

(F)
SELECT CASE GROUPING_ID(product, country)
         WHEN 1 THEN 'Product'
         WHEN 2 THEN 'Country'
         WHEN 3 THEN 'Grand'
       END total
     , CASE GROUPING(product)
         WHEN 1 THEN 'TOTAL'
         ELSE product
       END product
     , CASE GROUPING(country)
         WHEN 1 THEN 'TOTAL'
         ELSE country
       END country
     , SUM(sales) sales
FROM plch_sales
GROUP BY GROUPING SETS(
   (product),
   (country),
   ()
)
ORDER BY product, country;

使用道具 举报

回复
论坛徽章:
2
双黄蛋
日期:2011-11-06 08:21:16咸鸭蛋
日期:2011-11-06 08:50:48
15#
发表于 2011-11-1 22:33 | 只看该作者
CD

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
16#
发表于 2011-11-1 23:19 | 只看该作者
这个扩展分组题目不错,考察两点:
1.扩展分组中rollup,cube,grouping_sets的使用以及如何补充NULL分组加小计、合计功能(在扩展分组中,NULL分组可以用()代替)以及考察三大函数grouping,grouping_id,group_id
2.考察select经过计算的列与原始列同名,排序不加前缀,那么默认是按select列排序的规则

补充两个,排序就按照steven的排就可以了,当然也可以改进下,反正就几种
SELECT
product,
country,SUM(sales)
FROM plch_sales
GROUP BY GROUPING SETS(rollup(product),rollup(country))
HAVING group_id()=0;

SELECT product,country,SUM(sales)
FROM plch_sales
GROUP BY ROLLUP(product),ROLLUP(country)
HAVING product IS   NULL OR country IS  NULL ;

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
17#
发表于 2011-11-2 11:24 | 只看该作者
BDF
调试后发现少了一个A选项

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2011-11-2 12:50 | 只看该作者
學習了!

使用道具 举报

回复
论坛徽章:
11
2011新春纪念徽章
日期:2011-02-18 11:42:49阿斯顿马丁
日期:2013-10-31 16:33:252013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00奥运会纪念徽章:足球
日期:2012-08-19 15:57:15蛋疼蛋
日期:2012-02-22 22:32:12茶鸡蛋
日期:2012-02-14 23:20:502012新春纪念徽章
日期:2012-01-04 11:57:56复活蛋
日期:2011-12-28 11:00:35茶鸡蛋
日期:2011-12-07 17:10:33
19#
发表于 2011-11-2 13:36 | 只看该作者
只知道D肯定正确

使用道具 举报

回复
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
20#
发表于 2011-11-2 16:35 | 只看该作者
哈,可以拿回去改改做笔试题

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表