个人感觉有点难的.高手请进....正确就结贴.........

penglewen 2006-09-10 02:44:52
数据库结构如下:
m_sid ch_type ch_date ch_con
101256 上画 2006-09-01 00:00:00 红河实业烟草
101256 下画 2006-11-30 00:00:00 NULL
101302 上画 2006-09-01 00:00:00 红河实业烟草
101302 下画 2006-11-30 00:00:00 NULL
101389 上画 2006-09-01 00:00:00 红河实业烟草
101389 下画 2006-11-30 00:00:00 NULL
101256 下画 2006-10-01 00:00:00 NULL
101256 上画 2006-10-01 00:00:00 白马实业
101302 下画 2006-10-15 00:00:00 NULL
101302 上画 2006-10-15 00:00:00 和记实业
分析统计: 想要的结果就是下面这种形式的.而且有个判断条件就是: 下画日期要大于统计日期,过期的不要统计.
m_sid 上画日期 下画日期 新广告品牌 原广告品牌
101256 2006-09-01 00:00:00 2006-10-01 00:00:00 红河实业烟草 NULL
101256 2006-10-01 00:00:00 2006-11-30 00:00:00 白马实业 红河实业烟草
101302 2006-09-01 00:00:00 2006-10-15 00:00:00 红河实业烟草 NULL
101302 2006-10-15 00:00:00 2006-11-30 00:00:00 和记实业 红河实业烟草
101389 2006-09-01 00:00:00 2006-11-30 00:00:00 红河实业烟草 NULL
...全文
847 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
yowbell 2006-09-11
  • 打赏
  • 举报
回复
作个记号!
jialiu 2006-09-11
  • 打赏
  • 举报
回复
www.shbarcode.com
terryghz 2006-09-10
  • 打赏
  • 举报
回复
mark
penglewen 2006-09-10
  • 打赏
  • 举报
回复
明天试试,如果行的话就结贴.....分不够再加......先谢谢大家了....
紫气东来_999 2006-09-10
  • 打赏
  • 举报
回复
俺也是(邹建)的大FANS
呵呵
zsforever 2006-09-10
  • 打赏
  • 举报
回复
如果同m_sid的上画和上画、下画和下画的时间都不相同这个可以了,
但这样的数据结构怎么看怎么别扭
zsforever 2006-09-10
  • 打赏
  • 举报
回复
declare @t table(m_sid int,ch_type varchar(8),ch_date datetime,ch_con varchar(32))
insert into @t select
101256, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select
101256, '下画', '2006-11-30 00:00:00', NULL union all select
101302, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select
101302, '下画', '2006-11-30 00:00:00', NULL union all select
101256, '上画', '2006-09-02 00:00:00', '没有了' union all select
101256, '下画', '2006-09-02 00:00:00', NULL
--select * from @t
declare @统计日期 datetime
set @统计日期='2006-9-1'
select A.m_sid,A.ch_date [上画日期],B.ch_date [下画日期],A.ch_con [新广告品牌],C.ch_con [原广告品牌]
from
@t A inner join @t B on A.ch_type='上画' and B.ch_type='下画' and A.m_sid=B.m_sid and
(select count(1) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)=
(select count(1) from @t where ch_type='下画' and m_sid=A.m_sid and ch_date<B.ch_date)
left join @t C on C.ch_type='上画' and C.m_sid=A.m_sid and
C.ch_date=(select max(ch_date) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)
where A.ch_date>=@统计日期
order by A.m_sid
penglewen 2006-09-10
  • 打赏
  • 举报
回复
101256 上画 2006-09-01 00:00:00 红河实业烟草
101256 下画 2006-11-30 00:00:00 NULL
101302 上画 2006-09-01 00:00:00 红河实业烟草
101302 下画 2006-11-30 00:00:00 NULL
101256 上画 2006-09-02 00:00:00 没有了
101256 下画 2006-09-02 00:00:00 NULL

原始记录
zsforever 2006-09-10
  • 打赏
  • 举报
回复
declare @t table(m_sid int,ch_type varchar(8),ch_date datetime,ch_con varchar(32))
insert into @t select
101256, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select
101256, '下画', '2006-11-30 00:00:00', NULL union all select
101302, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select
101302, '下画', '2006-11-30 00:00:00', NULL union all select
101389, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select
101389, '下画', '2006-11-30 00:00:00', NULL union all select
101256, '下画', '2006-10-01 00:00:00', NULL union all select
101256, '上画', '2006-10-01 00:00:00', '白马实业' union all select
101302, '下画', '2006-10-15 00:00:00', NULL union all select
101302, '上画', '2006-10-15 00:00:00', '和记实业'
--select * from @t
declare @统计日期 datetime
set @统计日期='2006-9-1'
select A.m_sid,A.ch_date [上画日期],B.ch_date [下画日期],A.ch_con [新广告品牌],C.ch_con [原广告品牌]
from
@t A inner join @t B on A.ch_type='上画' and B.ch_type='下画' and A.m_sid=B.m_sid and
B.ch_date=(select min(ch_date) from @t where ch_type='下画' and m_sid=A.m_sid and ch_date>=A.ch_date)
left join @t C on C.ch_type='上画' and C.m_sid=A.m_sid and
C.ch_date=(select max(ch_date) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)
where A.ch_date>=@统计日期
order by A.m_sid
--结果

(所影响的行数为 10 行)

m_sid 上画日期 下画日期 新广告品牌 原广告品牌
----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------- --------------------------------
101256 2006-09-01 00:00:00.000 2006-10-01 00:00:00.000 红河实业烟草 NULL
101256 2006-10-01 00:00:00.000 2006-10-01 00:00:00.000 白马实业 红河实业烟草
101302 2006-09-01 00:00:00.000 2006-10-15 00:00:00.000 红河实业烟草 NULL
101302 2006-10-15 00:00:00.000 2006-10-15 00:00:00.000 和记实业 红河实业烟草
101389 2006-09-01 00:00:00.000 2006-11-30 00:00:00.000 红河实业烟草 NULL

(所影响的行数为 5 行)
zsforever 2006-09-10
  • 打赏
  • 举报
回复
得出这个结果的原始记录是哪些?
penglewen 2006-09-10
  • 打赏
  • 举报
回复
101256 2006-09-01 00:00:00 2006-09-02 00:00:00 红河实业烟草 NULL
101256 2006-09-02 00:00:00 2006-09-02 00:00:00 没有了 红河实业烟草
101302 2006-09-01 00:00:00 2006-11-30 00:00:00 红河实业烟草 NULL

这是zsforever(虎虎)的结果..就是那个101256第二条的记录的下画日期错了..........再看看吧.......
zicxc 2006-09-10
  • 打赏
  • 举报
回复
同一天很难分,先上当天下的可能性应该小于当天下了当天上另一个

lz那好像是广告牌上下的问题
hellowork 2006-09-10
  • 打赏
  • 举报
回复
这样试试:
if object_id('tempdb..#tmp') is not null
drop table #tmp
GO
----创建测试数据
declare @t table(m_sid int,ch_type varchar(10),ch_date datetime,ch_con varchar(50))
insert @t
select 101256,'上画','2006-09-01 00:00:00','红河实业烟草' union all
select 101256,'下画','2006-11-30 00:00:00',NULL union all
select 101302,'上画','2006-09-01 00:00:00','红河实业烟草' union all
select 101302,'下画','2006-11-30 00:00:00',NULL union all
select 101389,'上画','2006-09-01 00:00:00','红河实业烟草' union all
select 101389,'下画','2006-11-30 00:00:00',NULL union all
select 101256,'下画','2006-10-01 00:00:00',NULL union all
select 101256,'上画','2006-10-01 00:00:00','白马实业' union all
select 101302,'下画','2006-10-15 00:00:00',NULL union all
select 101302,'上画','2006-10-15 00:00:00','和记实业'

----设置截止日期
declare @EndDate datetime
set @EndDate = '2006-12-31'

----生成临时表
select *,
GroupID = (select count(1) from @t where m_sid = a.m_sid and ch_date < a.ch_date and ch_type=a.ch_type),
原广告品牌 = (select top 1 ch_con from @t where m_sid = a.m_sid and ch_date < a.ch_date and a.ch_type = '上画' order by m_sid,ch_date )
into #tmp from @t a where ch_date <= @EndDate
order by m_sid,ch_date

----汇总
select m_sid,
上画日期 = max(case ch_type when '上画' then ch_date end),
下画日期 = max(case ch_type when '下画' then ch_date end),
新广告品牌 = max(case ch_type when '上画' then ch_con end),
原广告品牌 = max(case ch_type when '上画' then 原广告品牌 end)
from #tmp group by m_sid,GroupID order by m_sid

----清除测试环境
drop table #tmp
zsforever 2006-09-10
  • 打赏
  • 举报
回复
and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type =N'上画' and ch_date<a.ch_date)
因为可能是同一天,所以感觉用ch_date<=a.ch_date 更准确
zicxc 2006-09-10
  • 打赏
  • 举报
回复
看看上面的结果,指出哪里不对

zicxc 2006-09-10
  • 打赏
  • 举报
回复

declare @t table(
m_sid int,
ch_type nvarchar(20),
ch_date datetime,
ch_con nvarchar(50)
)

insert @t select
101256, N'上画', '2006-09-01', N'红河实业烟草'
union all select
101256, N'下画', '2006-11-30', NULL
union all select
101302, N'上画', '2006-09-01', N'红河实业烟草'
union all select
101302, N'下画', '2006-11-30', NULL
union all select
101256, N'上画', '2006-09-02', N'没有了'
union all select
101256, N'下画', '2006-09-02', NULL


declare @统计日期 datetime
set @统计日期='2006-1-1'

select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌
,(select top 1 ch_con from @t where m_sid =b.m_sid and ch_type =N'上画' and ch_date<b.ch_date order by ch_date desc) as 原广告品牌
from @t a,@t b
where a.ch_date>@统计日期
and a.ch_type =N'下画'
and b.ch_type =N'上画'
and a.m_sid =b.m_sid
and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type =N'上画' and ch_date<a.ch_date)

--结果
m_sid 上画日期 下画日期 新广告品牌 原广告品牌
----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- --------------------------------------------------
101256 2006-09-01 00:00:00.000 2006-09-02 00:00:00.000 红河实业烟草 NULL
101302 2006-09-01 00:00:00.000 2006-11-30 00:00:00.000 红河实业烟草 NULL
101256 2006-09-02 00:00:00.000 2006-11-30 00:00:00.000 没有了 红河实业烟草

(所影响的行数为 3 行)
zicxc 2006-09-10
  • 打赏
  • 举报
回复
语句有些地方改了,你复制过去没有?

改了哪些地方,我都说明了的


zsforever 2006-09-10
  • 打赏
  • 举报
回复
用这个测试一下--把@t 换成你的表名
declare @统计日期 datetime
set @统计日期='2006-9-1'
select A.m_sid,A.ch_date [上画日期],B.ch_date [下画日期],A.ch_con [新广告品牌],C.ch_con [原广告品牌]
from
@t A inner join @t B on A.ch_type='上画' and B.ch_type='下画' and A.m_sid=B.m_sid and
B.ch_date=(select min(ch_date) from @t where ch_type='下画' and m_sid=A.m_sid and ch_date>=A.ch_date)
left join @t C on C.ch_type='上画' and C.m_sid=A.m_sid and
C.ch_date=(select max(ch_date) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)
where A.ch_date>=@统计日期
order by A.m_sid
penglewen 2006-09-10
  • 打赏
  • 举报
回复
101256 上画 2006-09-01 00:00:00 红河实业烟草
101256 下画 2006-11-30 00:00:00 NULL
101302 上画 2006-09-01 00:00:00 红河实业烟草
101302 下画 2006-11-30 00:00:00 NULL
101256 上画 2006-09-02 00:00:00 没有了
101256 下画 2006-09-02 00:00:00 NULL
数据是有错,用这些........测试出来的结果也不对啊........
zicxc 2006-09-10
  • 打赏
  • 举报
回复
晕,我的测试程序没改,加order by
还有,因为我用了nvarchar所以'下画'要改成 N'下画'

declare @t table(
m_sid int,
ch_type nvarchar(20),
ch_date datetime,
ch_con nvarchar(50)
)
/*
insert @t select
101256, '上画', '2006-09-01', N'红河实业烟草'
union all select
101256, '下画', '2006-11-30', NULL
union all select
101302, '上画', '2006-09-01', N'红河实业烟草'
union all select
101302, '下画', '2006-11-30', NULL
union all select
101389, '上画', '2006-09-01', N'红河实业烟草'
union all select
101389, '下画', '2006-11-30', NULL
union all select
101256, '下画', '2006-10-01', NULL
union all select
101256, '上画', '2006-10-01', N'白马实业'
union all select
101302, '下画', '2006-10-15', NULL
union all select
101302, '上画', '2006-10-15', N'和记实业'
*/

insert @t select
101256, N'上画', '2006-09-01', N'红河实业烟草'
union all select
101256, N'下画', '2006-11-30', NULL
union all select
101302, N'上画', '2006-09-01', N'红河实业烟草'
union all select
101302, N'下画', '2006-11-30', NULL
union all select
101256, N'上画', '2006-09-02', N'没有了'
union all select
101256, N'下画', '2006-10-31', NULL


declare @统计日期 datetime
set @统计日期='2006-1-1'

select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌
,(select top 1 ch_con from @t where m_sid =b.m_sid and ch_type =N'上画' and ch_date<b.ch_date order by ch_date desc) as 原广告品牌
from @t a,@t b
where a.ch_date>@统计日期
and a.ch_type =N'下画'
and b.ch_type =N'上画'
and a.m_sid =b.m_sid
and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type =N'上画' and ch_date<a.ch_date)

--结果
m_sid 上画日期 下画日期 新广告品牌 原广告品牌
----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- --------------------------------------------------
101302 2006-09-01 00:00:00.000 2006-11-30 00:00:00.000 红河实业烟草 NULL
101256 2006-09-02 00:00:00.000 2006-11-30 00:00:00.000 没有了 红河实业烟草
101256 2006-09-02 00:00:00.000 2006-10-31 00:00:00.000 没有了 红河实业烟草

(所影响的行数为 3 行)

加载更多回复(20)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧