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 [ ...
随机推荐
- c#中cookies的存取操作
在客户端创建一个username的cookies,其值为gjy,有效期为1天. 方法1: Response.Cookies["username"].Value="zxf& ...
- MYSQLD c++函数修饰名转换工具c++filt
会话1: mysql> select now(); 会话2: [root@localhost ~]# stap -v -e 'probe process("/usr/local/mys ...
- bind的例子
10.24 给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值. #include<iostream> #include ...
- jQuery动态实现title的修改 失效问题
最近做了一个网站,一切都很顺利,在上线的时候,突然发现一个严重的问题,开始面对这个问题,完全不知所措(在goole.火狐.IE9及其以上都没得问题:IE8及其低版本都失效)只是浏览器弹出一个bug,但 ...
- c结构体初始化问题
结构体中的数组的初始化问题 我的代码 C/C++ code #include <stdio.h> #include <stdlib.h> struct a { int leng ...
- 深入理解计算机系统第二版习题解答CSAPP 2.9
基于三元色R(红)G(绿)B(蓝)关闭(0)和打开(1),能够创建8种不同的颜色,如下: R G B 颜色 R G B 颜色 0 0 0 黑色 1 0 0 红色 0 0 1 蓝色 1 0 1 红紫色 ...
- HDU-1034(简单模拟)
Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Java 内存分析图
client -------------------------- public class Client{ public static void main(String[] args){ Perso ...
- struts中调用servlet的两种方法——IcC方式和非IoC方式的代码demo
package com.java1234.action;//所在的包 import java.sql.Connection;//数据库连接的类 import java.util.ArrayList;/ ...
- Unity3D 中3D刚体组件的力
一般一个物体除了手动添加刚体受到重力作用外,还可以给该刚体添加一个其他的力. 这里就要涉及到一个恒定力(Constant Force)组件 首先要去掉物体的重力(因为重力是刚体组件中默认的一个向下的力 ...