SQL(笔试题)网站上的广告位是轮播的,每天某一广告位最多可轮播的广告数量是有限制的,比如A广告位,每天只能轮播三个广告,但销售人员在销售广告位时并不考虑此限制,要求查询出合同表中,超过广告位轮播数量的合同。
合同表 Orders
OrderID |
Positioncode |
Startdate |
Enddate |
1 |
A |
2006-11-01 |
2006-11-03 |
2 |
C |
2006-11-02 |
2006-11-03 |
3 |
B |
2006-11-01 |
2006-11-04 |
4 |
A |
2006-11-03 |
2006-11-04 |
5 |
C |
2006-11-01 |
2006-11-02 |
6 |
B |
2006-11-02 |
2006-11-05 |
7 |
A |
2006-11-02 |
2006-11-03 |
8 |
A |
2006-11-04 |
2006-11-05 |
9 |
C |
2006-11-03 |
2006-11-04 |
10 |
C |
2006-11-02 |
2006-11-04 |
广告位表 Product
Positioncode |
Showcount |
A |
2 |
B |
1 |
C |
3 |
说明:对于广告位A来讲,轮播情况如下表
OrderID |
2006-11-01 |
2006-11-02 |
2006-11-03 |
2006-11-04 |
2006-11-05 |
1 |
|||||
4 |
|||||
7 |
|||||
8 |
广告位A每天最多可轮播2个广告,但合同表中在2006-11-03这天有三个广告(1、4、7),对于广告位A,1、4、7则是最终需要得到的结果。如需要可使用临时表、存储过程等。
方法一:可以创建多个临时表来完成
--先创建一张临时日期表,来记录合约中所有广告位的日期
CREATE TABLE #calendar (d date);
DECLARE @stime date
DECLARE @etime date
set @stime=(select min(Startdate) from Orders);
set @etime=(select max(Enddate) from Orders);
--这种语法是用来提供通用表达式的
--用到批次添加多条记录(从最早的一天到最晚的一天)
WITH a1 AS
(
SELECT @stime as d
UNION ALL
SELECT DATEADD(dd,1,d) FROM a1 where a1.d<@etime
)
INSERT #calendar
SELECT d FROM a1
select * from #calendar
--创建临时表#B存放广告位、日期、合同号
select a.* into #B from(select Orders.Positioncode,c.d,Orders.OrderID
from #calendar c,Orders
where c.d between Orders.Startdate and Orders.Enddate)as a
select * from #B
--查询结果
--选出超出当天对应广告位轮播数量的日期和对应的广告位,将它存到临时表#D中
select s.* into #D from(select t.d,t.Positioncode from
(select d,Positioncode,COUNT(*)as c from #B group by d ,Positioncode) as t
inner join Product on t.Positioncode=Product.Positioncode
where t.c>Product.Showcount) as s
select * from #D
--得到各销售人员每天销售的广告位,将它放到一张临时表中#C
select s.* into #C from (SELECT
d
,Positioncode,stuff((
SELECT
','+convert(varchar(50),OrderID)
FROM dbo.#B AS tb01 where tb01.d=tb02.d and tb01.Positioncode=tb02.Positioncode
FOR xml PATH('')),1,1,'') AS classList
FROM dbo.#B AS tb02
GROUP BY Positioncode,d) as s
select * from #C
(注意用:MySql中group_concat函数很方便)
得到结果:
--结合临时表#C、#D得到最终结果
select #C.* from #C,#D where #C.d=#D.d and #C.Positioncode=#D.Positioncode;
第一种方法看起来很简单,但里面涉及到的知识点多,以后有时间再整理。
想办法用存储过程等高级语法来实现
SQL(笔试题)网站上的广告位是轮播的,每天某一广告位最多可轮播的广告数量是有限制的,比如A广告位,每天只能轮播三个广告,但销售人员在销售广告位时并不考虑此限制,要求查询出合同表中,超过广告位轮播数量的合同。的更多相关文章
- SQLServer 常见SQL笔试题之语句操作题详解
SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...
- [SQL]数据分析SQL笔试题
SQL笔试题 1.请简单写出left join和join的用法区别(可举例说明): 2.求出订单表(order表)中每个客户(custid)的最近一次购买日期(要求:按custid降序排列,trans ...
- SQL笔试题:下面是学生表(student)的结构说明
SQL笔试题:下面是学生表(student)的结构说明 SQL笔试题:下面是学生表(student)的结构说明 字段名称 字段解释 字段类型 字段长度 约束 s_id 学号 字符 10 PK s_na ...
- 必会SQL笔试题
()表名:购物信息 购物人 商品名称 数量 A 甲 B 乙 C 丙 A 丁 B 丙 …… 给出所有购入商品为两种或两种以上的购物人记录 答:); ()表名:成绩表 姓名 课程 分数 张三 语文 张三 ...
- 【笔试必备】常见sql笔试题(30题)
sql是测试从业者必备的技能之一,基本上也是笔试必考内容. 所以,不要让sql拖了后腿,有些测友一遇到多表关联查询就犯晕,甚至连单表的执行顺序都没搞懂,下面简单介绍下,顺便给一些题供大家练习. 单表执 ...
- [笔试题]黑板上写下50个数字,选两个黑板上数字a和b,在黑板写|b-a|,剩下的数字?
在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下操作:选取两个黑板上的数字a和b,擦去,在黑板上写|b-a|.请问最后一次动作之后剩下的数字可能是什么?为什么?(不用写代码,不写原 ...
- sql笔试题
笔试题1: 1.select * from tablex where name = "张*" order by age 默认升序 select * from table ...
- Oracle最新的Sql笔试题及答案
部门表(SM_DEPT) 字段名称 数据类型 是否主键 注释 DEPT_ID NUMBER Y 部门ID PARENT_DEPARTMENT_ID NUMBER N 上级部门 DEPARTMENT_N ...
- 来自中油瑞飞的SQL笔试题20131202
1.有三张表,用户表,用户角色表,角色表, 使用sql显示如下内容: 用户ID,用户名,超级管理员,录入员,会计 也就是角色用逗号分隔. 解: 1.填充数据到表User select * from [ ...
随机推荐
- dubbo使用方法
dubbo使用方法. Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载. ...
- iOS9适配
一.App Transport Security xcode7安装后,你会发现ios9之后后默认所有http请求都无法继续有效,但是基于现状,我们并不能这么快改成https请求,所以基本上大多数app ...
- TCP/IP协议原理与应用笔记16:交换机和路由器区别
1.交换机和路由器区别 (1)交换机: 交换机是一种基于MAC(网卡的硬件地址)识别,能完成封装转发数据包功能的网络设备.交换机可以“学习”MAC地址,并把其存放在内部地址表中,通过在数据帧的 ...
- Android开发JDBC连接mysql数据库导入驱动方法
在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...
- WPF翻转动画
在WPF中要翻转对象,估计是得用三维变换,所以我用到了AxisAngleRotation3D,让图形绕着Z轴来旋转. 先看看效果. 是的,就是这样的效果,在XAML中,由于涉及三维图形,我先做了两个用 ...
- [Form Builer]Locking Mode and LOCK_RECORD
Locking Mode Property Description Specifies when Oracle Forms tries to obtain database locks on rows ...
- (整理)FORM:Oracle EBS客制化Form的菜单栏用法说明
用户最多可以定义45个form-level的trigger,名称必须为SPECIALn, 其中SPECIAL1 to SPECIAL15属于Tools菜单项,放在“工具”主菜单下. SPECIAL16 ...
- Spring 3.0 + Atomikos构建jta分布式事务
Spring3.0已经不再支持jtom了,不过我们可以用第三方开源软件atomikos(http://www.atomikos.com/)来实现.Atomikos是目前在分布式事务管理中做得相当不错的 ...
- 20160406javaweb 之JDBC简单案例
前几天写的user注册登录注销案例,没有用到数据库,现在做出改动,使用数据库存储信息: 一.首先我们需要建立一个数据库: 如下图: 创建数据库的代码如下: -- 导出 database02 的数据库结 ...
- VS2015 Cordova Ionic移动开发(一)
一.Windows环境配置 1.如果已经安装VS2015,打开[工具]-[选项]找到Cordova选项: 运行依赖关系查看器,用来检测开发环境是否完整. 如果检测显示: 那么就是环境配置完成了.可以直 ...