数据对比(广告计划与监播)的SQL语句问题—SQL大侠或有相关经验者请救急! (100分)

  • 主题发起人 主题发起人 fuyaping
  • 开始时间 开始时间
F

fuyaping

Unregistered / Unconfirmed
GUEST, unregistred user!
今有表A(广告排期表):代理商,频道,品牌,节目,承诺时段,规格(秒数),价钱,扣率,应付
表B(广告监播表):监播商,频道,品牌,节目,播出时间,规格(秒数),价钱,......
表C(对比差异表,播出时间在计划时间内):
频道,品牌,节目,日期,时段,规格(秒数),价差,量差
表D(对比差异表,播出时间在计划时间外):
频道,品牌,节目,日期,时间,规格(秒数),价差,量差

现在要做一个存储过程,对AB进行对比,找出差异(其中播出时间只要在承诺时段(两个字段)内算符合)
并将结果写入C或D (对比时可忽略代理商合监播商,也就是假设只有一家代理和一家监播商)
举例:
A有: 盛世长城,中央一套,娃哈哈,天下粮仓,02/1/1 20:30 到 21:00,15,70000,80%,56000
盛世长城,中央一套,娃哈哈,天下粮仓,02/1/1 20:30 到 21:00,15,70000,80%,56000
B有: 尼尔森 ,中央一套,娃哈哈,天下粮仓,02/1/1 20:45, 15,70000
尼尔森 ,中央一套,娃哈哈,天下粮仓,02/1/1 22:00, 15, 70000
那么应当对比出:
C: 中央一套,娃哈哈,天下粮仓,02/1/1 20:30 到 21:00,15,56000,1
D: 中央一套,娃哈哈,天下粮仓,02/1/1 22:00, 15,-56000,-1
从c,d可以看出,本日计划时段少播了一次,价差56000*2-70000*80%=56000
本日非计划时段多播一次,价差0-70000=70000=70000

 
大家帮忙啊,刚刚操作失误,本想给300的却给成了100分,只要有答案了另开话题加分!
刚开始的时候以为AB两表都有标准的“时段”字段,就像央视招标时标的"A1,B2"什么的。
于是就给AB各建了一视图,统计同一产品同一时段同一规格广告的播出次数和价钱
然后对比两视图,但后来告知没法统一时段的定义,所以就不知道怎么统计了:(
 
你叙述的问题还不够详细:
1.价钱是单价还是总价(每播一次的价格,还是所有的总和)
2.价差、量差的计算公式是如何?
3.扣率是怎样的?
我觉得以上的数据结构不是很合理
 
楼上的说有道理,我也觉得结构不合理。
另外,你适用的是什么数据库?不同的数据库于局不完全相同。
给你个参考:
insert into c
select a.频道,a.品牌,a.节目,b.播出日期 as 日期,a.承诺时段 as 时段,规格(秒数),a.应付 as 价差
from B as a left jion B as b on a.承诺时段 in b.播出时间
这个太不完整了,最好再说清楚一点。
还有,你的量差是甚么意思,没有明白。
 
谢谢二位,几点补充:
1:数据结构的合理性问题讨论意义不大,因为A,B都是分别是两个提供商提供的,没法改变
C,D是审计部门的要求,也不太可能有什么变化:(
2:Sql Server数据库。
3:价差量差对应于某代理某媒体(电视台)某承诺时段(两字段)某天的求和后的差
比方,承诺在19:50-20:30黄金剧场前播放三次,如果监测到一次,则量差为2
具体可以看我给的例子
4:折扣当然是代理商给定的,在这跟程序没很大关系,之所以写出是为了数据的真实性
5:A,B的每条记录对应一次播出(或计划播出)记录,所以价钱当然就是每次的了!
6:现在最大的问题是,代理商提供的排期的承诺时段是两个字段,而比较的时候要先统计
相同时段的数据,比方前面例子讲的两个20:30—21:00,则要合并到一起!相当于
group by 承诺时段,可是现在的承诺时段却是两个字段,该如何是好?(没法统一成
文字方式的A1,B2之类的形式)

 
如果量查不是自动生成的话,那么看看我上面的回答,更改一下是否有问题。
 
我也很难描述的很清楚,大家仔细看看例子就应当理解了!
 
承诺时段 = 日期 , 开始时间 , 终止时间 ? // 具体没有给出
播出时间 = 日期 , 时间 ? // 具体没有给出

CREATE PROCEDURE [XMH_31]
AS
DELETE FROM C
DELETE FROM D

--计算应播次数
SELECT 频道,品牌,节目,日期 , 开始时间 , 终止时间, 规格,价钱,扣率,应付 Count(*) as 次数
INTO #TEMP1
FROM A
GROUP BY 频道,品牌,节目,日期 , 开始时间 , 终止时间,规格,价钱,扣率,应付

--计算实播次数
SELECT 频道,品牌,节目,日期 , 时间,规格,价钱,扣率,应付 Count(*) As 次数
INTO #TEMP2
FROM B
GROUP BY 频道,品牌,节目,日期 , 时间,规格,价钱,扣率,应付

INSERT INTO C (频道,品牌,节目,日期 , 开始时间 , 终止时间,EndDate,规格,价差,量差)
SELECT T1.频道,T1.品牌,T1.节目,T1.日期,T1.开始时间, T1.终止时间,T1.规格,Calcu(价差),Calcu(量差) FROM #TEMP1 T1, #TEMP2 T2
WHERE T1.频道 = T2.频道 and T1.品牌 = T2.品牌 and T1.节目 = T2.节目 AND T1.日期 = T2.日期 AND T1.规格 = T2.规格 AND T2.时间 BETWEEN T1.开始时间 AND T1.终止时间

INSERT INTO C (频道,品牌,节目,日期 , 开始时间 , 终止时间,EndDate,规格,价差,量差)
SELECT T1.频道,T1.品牌,T1.节目,T1.日期,T1.开始时间, T1.终止时间,T1.规格,Calcu(价差),Calcu(量差) FROM #TEMP1 T1, #TEMP2 T2
WHERE T1.频道 = T2.频道 and T1.品牌 = T2.品牌 and T1.节目 = T2.节目 AND T1.日期 = T2.日期 AND T1.规格 = T2.规格 AND NOT(T2.时间 BETWEEN T1.开始时间 AND T1.终止时间 )

只写出思陆,语法和逻辑肯能有误


 
还是举个更清楚直观的例子吧!

播出计划(A)
媒介 品牌 日期 开始 结束 规格(秒) 价格 折扣 应付
央视一套 长虹 02-05-23 8:25:00 9:00:00 15 70000 0.8 56000
央视一套 长虹 02-05-23 8:25:00 9:00:00 15 70000 0.8 56000
央视一套 长虹 02-05-23 9:30:00 10:00:0 15 70000 0.8 56000
央视一套 长虹 02-05-24 8:25:00 9:00:00 15 70000 0.8 56000
央视一套 长虹 02-05-25 8:25:00 9:00:00 15 70000 0.8 56000
央视一套 长虹 02-05-25 8:25:00 9:00:00 15 70000 0.8 56000

将A对相同媒介品牌日期和时段的数据汇总后的视图(A1)
媒介 品牌 日期 开始 结束 规格(秒) 次数 应付
央视一套 长虹 02-05-23 8:25:00 9:00:00 15 2 112000
央视一套 长虹 02-05-23 9:30:00 10:00:00 15 1 56000
央视一套 长虹 02-05-24 8:25:00 9:00:00 15 1 56000
央视一套 长虹 02-05-25 8:25:00 9:00:00 15 2 112000

监播数据(B)
媒介 品牌 播出时间
央视一套 长虹 02-05-23 8:30:06 15 70000
央视一套 长虹 02-05-23 9:40:10 15 60000
央视一套 长虹 02-05-24 8:40:10 15 70000
央视一套 长虹 02-05-24 10:40:10 15 50000
央视一套 长虹 02-05-25 8:30:12 15 70000
央视一套 长虹 02-05-25 8:55:20 15 70000

将B期望按某种方式统计后得视图(B1)
媒介 品牌 日期 开始 结束 规格 次数 应付
央视一套 长虹 02-05-23 8:25:00 09:00:00 15 1 70000
央视一套 长虹 02-05-23 9:30:00 10:00:00 15 1 60000
央视一套 长虹 02-05-24 8:25:00 09:00:00 15 1 70000
央视一套 长虹 02-05-24 10:40:10 00:00:00 15 1 50000 (无计划数据)
央视一套 长虹 02-05-25 8:25:00 09:00:00 15 2 140000
(如果有监播记录不属于任何计划时段则将实际播出时间作为时段开始时间,结束时间为0)

得到A1,B1后就好办啦,从A1,B1很容易就可以看出:
23号的8:25—9:00时段少播了一次了,价差112000-70000; 9:30-10:00少播0次(正常)价差6000-56000
24号的8:25-9:00正常,价差7000-56000; 10:40:10-00:00:00多播了一次,价差50000-0
25号的8:25-9:00正常,价差140000-112000
上述结果容易得出并写入C,D表中

现在的唯一的问题是如何由B参考A1得出B1不管直接得出还是用临时表
大家认真看看示例,注意“时段”是开始和结束两个字段!
 
xmh_31兄计算的实播次数表(相当于我的B1)里的次数都是1啊,好象没什么意义的
因为每次播出都是一个时间点,肯定是唯一的,只有参照A1才有可能统计出一个播出次数(比方在一个节目前反复播出
同一个广告的次数)。
不过后面的between统计出来的有没有用我倒要试试!
 
to fuyaping
你要的是 C 和 D 不是 B1
我以上的答案已经求出c,d为什么还要b1,不要b1就求不出c,d吗?

 
-〉xmh_31兄计算的实播次数表(相当于我的B1)里的次数都是1啊
我理解错了
最后一句应该是
INSERT INTO D (频道,品牌,节目,日期 , 开始时间 , 终止时间,EndDate,规格,价差,量差)
SELECT T1.频道,T1.品牌,T1.节目,T1.日期,T1.开始时间, T1.终止时间,T1.规格,Calcu(价差),Calcu(量差) FROM #TEMP1 T1, #TEMP2 T2
WHERE T1.频道 = T2.频道 and T1.品牌 = T2.品牌 and T1.节目 = T2.节目 AND T1.日期 = T2.日期 AND T1.规格 = T2.规格 AND NOT(T2.时间 BETWEEN T1.开始时间 AND T1.终止时间 )
如果between不行可以用 >= or <=

 
你写的字段太多
我简化了一下
A ( A, B, C, BegDate, EndDate)
A, B, C, 2002-1-1 20:30:00 , 2002-1-1 21:00:00
A, B, C, 2002-1-1 20:30:00 , 2002-1-1 21:00:00
B ( A, B, C, MakeDate)
A, B, C, 2002-1-1 20:45:00
A, B, C, 2002-1-1 21:00:00
A, B, C, 2002-1-1 22:00:00

C ( A, B, C, Sub)
D ( A, B, C, Sub)

运行

CREATE PROCEDURE [AAA]
AS
DELETE FROM C
DELETE FROM D

SELECT A, B, C, BegDate, EndDate , Count(*) Sub
INTO #TEMP1
FROM A
GROUP BY A, B, C, BegDate, EndDate

--根据你说的这句话,没有必要,可以省略 , 可以认为 #TEMP2 = B
SELECT A, B, C, MakeDate , Count(*) Sub
INTO #TEMP2
FROM B
GROUP BY A, B, C, MakeDate

INSERT INTO C (A,B,C,Sub)
SELECT AA.A, AA.B, AA.C, BB.Sub FROM #TEMP1 AA, #TEMP2 BB
WHERE AA.A = BB.A AND AA.B = BB.B AND AA.C = BB.C AND BB.MakeDate BETWEEN AA.BegDate AND AA.EndDate

INSERT INTO D (A,B,C,Sub)
SELECT AA.A, AA.B, AA.C, BB.Sub FROM #TEMP1 AA, #TEMP2 BB
WHERE AA.A = BB.A AND AA.B = BB.B AND AA.C = BB.C AND not (BB.MakeDate BETWEEN AA.BegDate AND AA.EndDate)

得出结果
C ( A, B, C, Sub)
A, B, C, 1
A, B, C, 1
D ( A, B, C, Sub)
A, B, C, 1


 
以上的方法,我省略了计算价差等,我不懂,我想有我算出的C, D,你就很容易进行后面的
工作了
 
多人接受答案了。
 
后退
顶部