高手帮忙,搞了一天了,交叉表,分不够在送.急....急....急..

zhoulanga 2007-08-09 04:32:20
展厅名称 周末开始 周末结束 商家 开始时间 结束时间 平日价 周末价
展厅一 6 7 张三 2007-4-29 2007-10-13 518 498
展厅一 6 7 张三 2007-10-14 2007-10-28 633 633

说明:输入商家,开始时间和结束时间.生成交叉表,而且判断周末的价.如果周末开始开始为0和周末和平日价相同则不分周未和平日价..就要就是判断周末平时了...
输出:
如果输入商家,张三,2007-10-12到2007-10-14
生成表.
商家 2007-10-12 2007-10-13 2007-10-14
张三 518 498 633

说明:
2007-10-12为星期5没有在周末开始和周末结束里价格为平日518
2007-10-13 为星期6在周未开始里价格应为周末价498
2007-10-14 平日价和周末价相等可忽略周末开始和周末结束
...全文
138 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengmou 2007-08-09
  • 打赏
  • 举报
回复
--这段改为
select f.date,t.商家,case when datepart(dw,f.date) between t.周末开始 and t.周末结束 then t.周末价 else t.平日价 end as 价格
into #tmp
from #tb t
join f_getdate('2007-10-12','2007-10-14',null) f on f.date between t.开始时间 and t.结束时间
where t.商家 = '张三'
zhoulanga 2007-08-09
  • 打赏
  • 举报
回复
谢谢.搞定了.
zhoulanga 2007-08-09
  • 打赏
  • 举报
回复
TO:
mengmou()mengmou()

select f.date,t.商家,case when f.weekday = '星期六' and t.周末开始 = 6 or f.weekday = '星期日'and t.周末结束 = 7 then t.周末价 else t.平日价 end as 价格
into #tmp
from #tb t
join f_getdate('2007-10-12','2007-10-14',null) f on f.date between t.开始时间 and t.结束时间
where t.商家 = '张三'

周末开始 周末结束 不会定义死在周六或是周日.可能也会是4,6不规则的
mengmou 2007-08-09
  • 打赏
  • 举报
回复
--建立测试环境
create table #tb(展厅名称 varchar(10),周末开始 int,周末结束 int,商家 varchar(10),开始时间 datetime,结束时间 datetime,平日价 int,周末价 int)
insert #tb(展厅名称,周末开始,周末结束,商家,开始时间,结束时间,平日价,周末价)
select '展厅一','6','7','张三','2007-4-29','2007-10-13','518','498' union all
select '展厅一','6','7','张三','2007-10-14','2007-10-28','633','633'
go
--执行测试语句

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getdate]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_getdate]
GO

/*--生成列表

生成指定日期段的日期列表

--邹建 2005.03(引用请保留此信息)--*/

/*--调用示例

--查询工作日
SELECT * FROM dbo.f_getdate('2005-1-3','2005-4-5',0)

--查询休息日
SELECT * FROM dbo.f_getdate('2005-1-3','2005-4-5',1)

--查询全部日期
SELECT * FROM dbo.f_getdate('2005-1-3','2005-4-5',NULL)
--*/

CREATE FUNCTION dbo.f_getdate(
@begin_date Datetime, --要查询的开始日期
@end_date Datetime, --要查询的结束日期
@bz bit --@bz=0 查询工作日,@bz=1 查询休息日,@bz IS NULL 查询全部日期
)RETURNS @re TABLE(id int identity(1,1),Date datetime,Weekday nvarchar(3))
AS
BEGIN
DECLARE @tb TABLE(ID int IDENTITY(0,1),a bit)
INSERT INTO @tb(a) SELECT TOP 366 0
FROM sysobjects a ,sysobjects b

IF @bz=0
WHILE @begin_date<=@end_date
BEGIN
INSERT INTO @re(Date,Weekday)
SELECT Date,DATENAME(Weekday,Date)
FROM(
SELECT Date=DATEADD(Day,ID,@begin_date)
FROM @tb
)a WHERE Date<=@end_date
AND (DATEPART(Weekday,Date)+@@DATEFIRST-1)%7 BETWEEN 1 AND 5
SET @begin_date=DATEADD(Day,366,@begin_date)
END
ELSE IF @bz=1
WHILE @begin_date<=@end_date
BEGIN
INSERT INTO @re(Date,Weekday)
SELECT Date,DATENAME(Weekday,Date)
FROM(
SELECT Date=DATEADD(Day,ID,@begin_date)
FROM @tb
)a WHERE Date<=@end_date
AND (DATEPART(Weekday,Date)+@@DATEFIRST-1)%7 in(0,6)
SET @begin_date=DATEADD(Day,366,@begin_date)
END
ELSE
WHILE @begin_date<=@end_date
BEGIN
INSERT INTO @re(Date,Weekday)
SELECT Date,DATENAME(Weekday,Date)
FROM(
SELECT Date=DATEADD(Day,ID,@begin_date)
FROM @tb
)a WHERE Date<=@end_date
SET @begin_date=DATEADD(Day,366,@begin_date)
END

RETURN
END
GO

select f.date,t.商家,case when f.weekday = '星期六' and t.周末开始 = 6 or f.weekday = '星期日'and t.周末结束 = 7 then t.周末价 else t.平日价 end as 价格
into #tmp
from #tb t
join f_getdate('2007-10-12','2007-10-14',null) f on f.date between t.开始时间 and t.结束时间
where t.商家 = '张三'

declare @sql varchar(8000) set @sql = 'select 商家'

select @sql = @sql+ ',max(case when date = '''+ convert(varchar(10),date,120)+ ''' then 价格 else 0 end) as ['+ convert(varchar(10),date,120) + ']'
from #tmp

select @sql = @sql + ' from #tmp group by 商家'
exec(@sql)

go
--删除测试环境
drop table #tb,#tmp
go
/*--测试结果

商家 2007-10-12 2007-10-13 2007-10-14
---------- ----------- ----------- -----------
张三 518 498 633

*/
zhoulanga 2007-08-09
  • 打赏
  • 举报
回复
展厅名称 周末开始 周末结束 商家 开始时间 结束时间 平日价 周末价
展厅一 6 7 张三 2007-4-29 2007-10-13 518 498
展厅一 6 7 张三 2007-10-14 2007-10-28 633 633

上面的乱了..
自己先顶

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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