有点挑战性,大家试试(SQL语句的问题)

good2speed 2003-09-02 04:53:17
现有表a
日期 事件
---------------
2003-8-1 abc
2003-8-2
2003-8-3 xyz
.... ...

要变成下面有的日历

1 2 3 4 5 6 7
----------------------------
abc
xyz

.............

用T-sql,看怎么写?
...全文
115 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
good2speed 2003-09-02
  • 打赏
  • 举报
回复
OK.25号的问题还是没有解决.不过已达到我的要求.
谢谢各位!!!
zjcxc 元老 2003-09-02
  • 打赏
  • 举报
回复
注意
因为我考虑了你的表中可能存在多个月的情况,所以加上了对年月的处理,如果不需要,可以简化
同时,在显示结果中保留了年月和行的信息,如果你不需要,可以再不显示.

下面是不考虑多个月和仅显示日历样式的处理语句,表结果同上:
select 星期日,星期一,星期二,星期三,星期四,星期五,星期六
from(
select 行
,星期日=max(case 星期 when 1 then 事件 else '' end)
,星期一=max(case 星期 when 2 then 事件 else '' end)
,星期二=max(case 星期 when 3 then 事件 else '' end)
,星期三=max(case 星期 when 4 then 事件 else '' end)
,星期四=max(case 星期 when 5 then 事件 else '' end)
,星期五=max(case 星期 when 6 then 事件 else '' end)
,星期六=max(case 星期 when 7 then 事件 else '' end)
from(
select 星期=datepart(weekday,日期)
,行=datepart(week,日期)-datepart(week,(select min(日期) from @表a))
,事件
from @表a
) a group by 行
) a
good2speed 2003-09-02
  • 打赏
  • 举报
回复
To: tj_dns(愉快的登山者)

你的和zjcxc(邹建)一样

在第三行增加一行
insert a select '2003-8-25','xyz'
愉快的登山者 2003-09-02
  • 打赏
  • 举报
回复
create table a(
日期 datetime,
事件 varchar(10))

insert a select '2003-8-1','abc'
insert a select '2003-8-2',''
insert a select '2003-8-3','xyz'


select
isnull((select 事件 from a where datepart(wk, 日期) = datepart(wk, B.日期) and datepart(dw, 日期) = 1),'') [1],
isnull((select 事件 from a where datepart(wk, 日期) = datepart(wk, B.日期) and datepart(dw, 日期) = 2),'') [2],
isnull((select 事件 from a where datepart(wk, 日期) = datepart(wk, B.日期) and datepart(dw, 日期) = 3),'') [3],
isnull((select 事件 from a where datepart(wk, 日期) = datepart(wk, B.日期) and datepart(dw, 日期) = 4),'') [4],
isnull((select 事件 from a where datepart(wk, 日期) = datepart(wk, B.日期) and datepart(dw, 日期) = 5),'') [5],
isnull((select 事件 from a where datepart(wk, 日期) = datepart(wk, B.日期) and datepart(dw, 日期) = 6),'') [6],
isnull((select 事件 from a where datepart(wk, 日期) = datepart(wk, B.日期) and datepart(dw, 日期) = 7),'') [7]
from A as B
group by datepart(wk, B.日期)

good2speed 2003-09-02
  • 打赏
  • 举报
回复
--------------------------------------------------------
To:zjcxc(邹建)

你的也不行.把创建数据测试环境增加一行,你在试试.
25号与3号只差一个星期!!!

-- 创建数据测试环境
declare @表a table(日期 datetime,事件 varchar(100))
insert into @表a
select '2003-08-01','abc'
union all select '2003-08-02',''
union all select '2003-8-3','xyz'
union all select '2003-8-25','xyz1'
----------------------------------------------------------------
加油,还差一步了!!!
good2speed 2003-09-02
  • 打赏
  • 举报
回复
To:txlicenhe(马可@李)

你的语句会产生一个7*31的表.

而我要的是一个日历,是一个7*4或7*5的表

To:gmc007(江西的佬表)

你的思路,我要想想.如果能成,立刻给分

BTW,如果你写下SQL,那是最好.
zjcxc 元老 2003-09-02
  • 打赏
  • 举报
回复
下面这个没问题了.

-- 创建数据测试环境
declare @表a table(日期 datetime,事件 varchar(100))
insert into @表a
select '2003-08-01','abc'
union all select '2003-08-02',''
union all select '2003-8-3','xyz'

--得到结果
select 年月,行
,星期日=max(case 星期 when 1 then 事件 else '' end)
,星期一=max(case 星期 when 2 then 事件 else '' end)
,星期二=max(case 星期 when 3 then 事件 else '' end)
,星期三=max(case 星期 when 4 then 事件 else '' end)
,星期四=max(case 星期 when 5 then 事件 else '' end)
,星期五=max(case 星期 when 6 then 事件 else '' end)
,星期六=max(case 星期 when 7 then 事件 else '' end)
from(
select 年月,星期,事件
,行=datepart(week,日期)-datepart(week,(select min(日期) from @表a where convert(varchar(6),日期,112)=a.年月))
from(
select 年月=convert(varchar(6),日期,112)
,星期=datepart(weekday,日期)
,日期,事件
from @表a
) a
) a group by 年月,行
gmc007 2003-09-02
  • 打赏
  • 举报
回复
给你一个思路:

1、建立一个临时表用来保存“星期”
2、用datename函数来取得“当天”是星期几
SELECT DATENAME(weekday, getdate()) AS 'WeekDay_Name'

txlicenhe 2003-09-02
  • 打赏
  • 举报
回复
我试了,是对的,8月1号本来就是星期五,你写成星期六了。
如果一定要按你的要求可以这样:

Select (case when datepart(weekday,日期) = 1 then 事件 else '' end) as 星期1,
(case when datepart(weekday,日期) = 2 then 事件 else '' end) as 星期2,
(case when datepart(weekday,日期) = 3 then 事件 else '' end) as 星期3,
(case when datepart(weekday,日期) = 4 then 事件 else '' end) as 星期4,
(case when datepart(weekday,日期) = 5 then 事件 else '' end) as 星期5,
(case when datepart(weekday,日期) = 6 then 事件 else '' end) as 星期6,
(case when datepart(weekday,日期) = 7 then 事件 else '' end) as 星期7
from 表a
good2speed 2003-09-02
  • 打赏
  • 举报
回复
To: txlicenhe(马可@李)

生成的表不对.你自己试试.
txlicenhe 2003-09-02
  • 打赏
  • 举报
回复
Select (case when datepart(weekday,日期) = 2 then 事件 else '' end) as 星期1,
(case when datepart(weekday,日期) = 3 then 事件 else '' end) as 星期2,
(case when datepart(weekday,日期) = 4 then 事件 else '' end) as 星期3,
(case when datepart(weekday,日期) = 5 then 事件 else '' end) as 星期4,
(case when datepart(weekday,日期) = 6 then 事件 else '' end) as 星期5,
(case when datepart(weekday,日期) = 7 then 事件 else '' end) as 星期6,
(case when datepart(weekday,日期) = 1 then 事件 else '' end) as 星期7
from 表a
eastpond 2003-09-02
  • 打赏
  • 举报
回复
gz
good2speed 2003-09-02
  • 打赏
  • 举报
回复
TO:mjhnet(天涯沦落人)
我用case when好像搞不定.
good2speed 2003-09-02
  • 打赏
  • 举报
回复
6代表'星期六'
1代表'星期一'
mjhnet 2003-09-02
  • 打赏
  • 举报
回复
类似的用 case when 语句,不过你的举例不太对阿
yujohny 2003-09-02
  • 打赏
  • 举报
回复
看不明白,怎么‘abc’变到了6号,‘xyz’却到了1号????
yujohny 2003-09-02
  • 打赏
  • 举报
回复
看不明白,怎么abc变到6号了,xyz又变到1号下面了????
fling_boy 2003-09-02
  • 打赏
  • 举报
回复
交差数据报表,看sql-server的帮助.

34,875

社区成员

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

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