请熟悉SQL的进来帮帮手

flers 2007-03-05 05:16:14
有一个查询出来的列表结果是
DateName Span Weeks WorkStatusName
时间段一 08:00-08:30 长周一 在岗
时间段二 08:30-09:30 长周一 修息
时间段三 09:00-09:30 长周一 在岗
时间段四 09:00-10:30 长周一 在岗
时间段二 08:00-08:30 短周一 在岗
时间段二 08:00-08:30 短周一 修息
时间段三 08:00-08:30 短周一 在岗
..
想排成这样的格式

名称 时间段 长周一 短周一 ...
时间段一 08:00-08:30 在岗 在岗
时间段二 08:30-09:30 修息 在岗
时间段三 09:00-09:30 在岗 在岗
时间段四 09:00-10:30 在岗


..
谢谢

...全文
288 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
conichiwa 2007-03-06
  • 打赏
  • 举报
回复
我看LZ好像就只有 在岗 和 修息 两种状态,建议先把两种状态转成 0 和 1再参考dawugui(潇洒老乌龟) 写的代码就可以了
flers 2007-03-06
  • 打赏
  • 举报
回复
按中国风的思路定了,但出错了,请帮我改下
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


ALTER Proc P_QueryWorkPlanDateTime
(
@DateTimeName VARCHAR(40),
@StaffNo VARCHAR(40),
@AcademicYear VARCHAR(50),
@StatusName VARCHAR(10),
@WeekStatus VARCHAR(10),
@WEEKNO VARCHAR(3)
)

AS
DECLARE @SQLWHERE VARCHAR(500)
SET @SQLWHERE = ' WHERE 1=1 '
IF (@StaffNo <> '')
SET @SQLWHERE = @SQLWHERE + ' AND StaffNo = '''+@StaffNo+''''
IF (@AcademicYear <> '')
SET @SQLWHERE = @SQLWHERE + ' AND T_StaffWorkPlanDate.AcademicYear = '''+@StaffNo+''''
IF (@StatusName <> '')
SET @SQLWHERE = @SQLWHERE + ' AND T_WorkStatus.StatusName = '''+@StatusName+''''
IF (@WeekStatus <> '')
SET @SQLWHERE = @SQLWHERE + ' AND T_StaffWorkPlanDate.WeekStatus = '''+@WeekStatus+''''
IF (@WEEKNO <> '')
SET @SQLWHERE = @SQLWHERE + ' AND T_StaffWorkPlanDate.Week = '''+@WeekStatus+''''
declare @sql varchar(2000)
select @sql=isnull(@sql,'')+',['+weeks+']=max( case weeks when '''+weeks+''' then WorkStatusName end)
from
(
SELECT dbo.T_WorkTime.WorkDateName AS DateName,
dbo.T_WorkTime.WorkStartDate AS StartDate, T_WorkTime.WorkStartDate+''-''+T_WorkTime.WorkEndDate AS SPAN,
dbo.T_StaffWorkPlanDate.WorkStatusID AS EndDate, dbo.T_StaffWorkPlanDate.*,
T_StaffWorkPlanDate.WeekStatus+T_StaffWorkPlanDate.week as Weeks,
dbo.T_WorkStatus.StatusName AS WorkStatusName
FROM dbo.T_StaffWorkPlanDate INNER JOIN
dbo.T_WorkTime ON
dbo.T_StaffWorkPlanDate.WorkTimeID = dbo.T_WorkTime.WorkTimeID INNER JOIN
dbo.T_WorkStatus ON
dbo.T_StaffWorkPlanDate.WorkStatusID = dbo.T_WorkStatus.WorkStatusID

) A ' + @SQLWHERE +' Group by Weeks '
set @sql = 'select [DateName],Span ' + @sql

IF (@DateTimeName<>'')
SET @sql = @sql + '
from
(
SELECT dbo.T_WorkTime.WorkDateName AS DateName,
dbo.T_WorkTime.WorkStartDate AS StartDate, T_WorkTime.WorkStartDate+''-''+T_WorkTime.WorkEndDate AS SPAN,
dbo.T_StaffWorkPlanDate.WorkStatusID AS EndDate, dbo.T_StaffWorkPlanDate.*,
T_StaffWorkPlanDate.WeekStatus+T_StaffWorkPlanDate.week as Weeks,
dbo.T_WorkStatus.StatusName AS WorkStatusName
FROM dbo.T_StaffWorkPlanDate INNER JOIN
dbo.T_WorkTime ON
dbo.T_StaffWorkPlanDate.WorkTimeID = dbo.T_WorkTime.WorkTimeID INNER JOIN
dbo.T_WorkStatus ON
dbo.T_StaffWorkPlanDate.WorkStatusID = dbo.T_WorkStatus.WorkStatusID
)
a where a.DateName='''+@DateTimeName+'''
group by [DateName],Span '
ELSE
SET @sql = @sql + '
from
(
SELECT dbo.T_WorkTime.WorkDateName AS DateName,
dbo.T_WorkTime.WorkStartDate AS StartDate, T_WorkTime.WorkStartDate+''-''+T_WorkTime.WorkEndDate AS SPAN,
dbo.T_StaffWorkPlanDate.WorkStatusID AS EndDate, dbo.T_StaffWorkPlanDate.*,
T_StaffWorkPlanDate.WeekStatus+T_StaffWorkPlanDate.week as Weeks,
dbo.T_WorkStatus.StatusName AS WorkStatusName
FROM dbo.T_StaffWorkPlanDate INNER JOIN
dbo.T_WorkTime ON
dbo.T_StaffWorkPlanDate.WorkTimeID = dbo.T_WorkTime.WorkTimeID INNER JOIN
dbo.T_WorkStatus ON
dbo.T_StaffWorkPlanDate.WorkStatusID = dbo.T_WorkStatus.WorkStatusID
)
a group by [DateName],Span '
print @sql
--exec(@sql)


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

服务器: 消息 207,级别 16,状态 3,过程 P_QueryWorkPlanDateTime,行 27
列名 'weeks' 无效。
服务器: 消息 207,级别 16,状态 1,过程 P_QueryWorkPlanDateTime,行 27
列名 'weeks' 无效。
dawugui 2007-03-05
  • 打赏
  • 举报
回复
DateName Span Weeks WorkStatusName
时间段一 08:00-08:30 长周一 在岗
时间段二 08:30-09:30 长周一 修息
时间段三 09:00-09:30 长周一 在岗
时间段四 09:00-10:30 长周一 在岗
时间段二 08:00-08:30 短周一 在岗
时间段二 08:00-08:30 短周一 修息
时间段三 08:00-08:30 短周一 在岗
数据有问题吗?

参考这个:

普通行列转换

假设有张学生成绩表(t)如下

Name Subject Result
张三 语文  73
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94

想变成
姓名 语文 数学 物理
张三 73  83  93
李四 74  84  94

create table #t
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)

insert into #t(Name , Subject , Result) values('张三','语文','73')
insert into #t(Name , Subject , Result) values('张三','数学','83')
insert into #t(Name , Subject , Result) values('张三','物理','93')
insert into #t(Name , Subject , Result) values('李四','语文','74')
insert into #t(Name , Subject , Result) values('李四','数学','83')
insert into #t(Name , Subject , Result) values('李四','物理','93')

declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
from (select distinct Subject from #t) as a
set @sql = @sql + ' from #t group by name'
exec(@sql)

drop table #t

--结果
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 83 93 74
张三 83 93 73

----------------------------------------------------
如果上述两表互相换一下:即

姓名 语文 数学 物理
张三 73  83  93
李四 74  84  94

想变成
Name Subject Result
张三 语文  73
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94

create table #t
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)

insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)

select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
select 姓名 as Name,'物理' as Subject,物理 as Result from #t
order by 姓名 desc

drop table #t

--结果
Name Subject Result
---------- ------- -----------
张三 数学 83
张三 物理 93
张三 语文 73
李四 数学 84
李四 物理 94
李四 语文 74

(所影响的行数为 6 行)
jiazheng 2007-03-05
  • 打赏
  • 举报
回复
select s.Datename,max(s.span) as '时间段',t.WorkStatusName as '长同一',v.WorkStatusName as '短周一'
from Table as s left join
(select DateName,Span,WorkStatusName where Weeks='长周一') as t on s.Dataname=t.Datename
left join
(select DateName,Span,WorkStatusName where Weeks='长周一') as v on s.DateName=v.DateName
group by DateName
中国风 2007-03-05
  • 打赏
  • 举报
回复
select [DateName],Span,[长周一]=max( case weeks when '长周一' then WorkStatusName end) ,[短周一]=max( case weeks when '短周一' then WorkStatusName end) from ta group by [DateName],Span
这是静态的语句
中国风 2007-03-05
  • 打赏
  • 举报
回复
create table ta ([DateName] varchar(20), Span varchar(20) ,
Weeks varchar(10), WorkStatusName varchar(10))
insert ta
select '时间段一', '08:00-08:30', '长周一', '在岗'union all
select '时间段二', '08:30-09:30', '长周一', '修息'union all
select '时间段三', '09:00-09:30', '长周一', '在岗'union all
select '时间段四', '09:00-10:30', '长周一', '在岗'union all
select '时间段二', '08:00-08:30', '短周一', '在岗'union all
select '时间段二', '08:00-08:30', '短周一', '修息'union all
select '时间段三', '08:00-08:30', '短周一', '在岗'

declare @sql varchar(2000)
select @sql=isnull(@sql,'')+',['+weeks+']=max( case weeks when '''+weeks+''' then WorkStatusName end) '
from ta group by Weeks
--print @sql
select @sql='select [DateName],Span'+@sql+' from ta group by [DateName],Span'
exec(@sql)
没有的替换为null
DateName Span 长周一 短周一
-------------------- -------------------- ---------- ----------
时间段二 08:00-08:30 NULL 在岗
时间段三 08:00-08:30 NULL 在岗
时间段一 08:00-08:30 在岗 NULL
时间段二 08:30-09:30 修息 NULL
时间段三 09:00-09:30 在岗 NULL
时间段四 09:00-10:30 在岗 NULL
警告: 聚合或其他 SET 操作消除了空值。

(6 行受影响)
中国风 2007-03-05
  • 打赏
  • 举报
回复
create table ta ([DateName] varchar(20), Span varchar(20) ,
Weeks varchar(10), WorkStatusName varchar(10))
insert ta
select '时间段一', '08:00-08:30', '长周一', '在岗'union all
select '时间段二', '08:30-09:30', '长周一', '修息'union all
select '时间段三', '09:00-09:30', '长周一', '在岗'union all
select '时间段四', '09:00-10:30', '长周一', '在岗'union all
select '时间段二', '08:00-08:30', '短周一', '在岗'union all
select '时间段二', '08:00-08:30', '短周一', '修息'union all
select '时间段三', '08:00-08:30', '短周一', '在岗'

declare @sql varchar(2000)
select @sql=isnull(@sql,'')+',['+weeks+']=max( case weeks when '''+weeks+''' then WorkStatusName else '''' end) '
from ta group by Weeks
--print @sql
select @sql='select [DateName],Span'+@sql+' from ta group by [DateName],Span'
exec(@sql)


DateName Span 长周一 短周一
-------------------- -------------------- ---------- ----------
时间段二 08:00-08:30 在岗
时间段三 08:00-08:30 在岗
时间段一 08:00-08:30 在岗
时间段二 08:30-09:30 修息
时间段三 09:00-09:30 在岗
时间段四 09:00-10:30 在岗

(6 行受影响)


paoluo 2007-03-05
  • 打赏
  • 举报
回复
靜態的

Select
[DateName] As 名称,
Span As 时间段,
Max(Case Weeks When N'长周一' Then WorkStatusName Else '' End) As 长周一,
Max(Case Weeks When N'短周一' Then WorkStatusName Else '' End) As 短周一
From TableName
Group By [DateName], Span


roy_88(中国风_燃烧你的激情!!!) 的有點小錯誤
paoluo 2007-03-05
  • 打赏
  • 举报
回复

Declare @S Nvarchar(4000)
Select @S = N'Select [DateName] As 名称, Span As 时间段'
Select @S = @S + N', Max(Case Weeks When N''' + Weeks + ''' Then WorkStatusName Else '''' End) As ' + Weeks
From (Select Distinct Weeks From TableName) A
Select @S = @S + ' From TableName Group By [DateName], Span'
EXEC(@S)
中国风 2007-03-05
  • 打赏
  • 举报
回复
select DateName, Span ,
[长周一]=max(case Weeks when '长周一' then WorkStatusName else '' end) '
[短周一]=max(case Weeks when '短周一' then WorkStatusName else '' end)
from 表名 group by DateName, Span
静态:
等下写个动态

paoluo 2007-03-05
  • 打赏
  • 举报
回复
时间段二 08:00-08:30 短周一 在岗
时间段二 08:00-08:30 短周一 修息
這個轉換之後的結果是怎樣的?

27,579

社区成员

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

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