如何使这个SQL查询

编程入门 行业动态 更新时间:2024-10-23 05:42:39
本文介绍了如何使这个SQL查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

大家好, 帮助plz 我有一个像这样的表:

hi all, Help plz I have a table like follows:

EmpID 01-Apr-2011 02-Apr-2011 03-Apr-2011 04-Apr-2011 05-Apr-2011 1 Shift1 Shift2 Shift3 Shift4 Shift5 2 Shift1 Shift2 Shift3 Shift4 Shift5 3 Shift1 Shift2 Shift3 Shift4 Shift5 4 Shift1 Shift2 Shift3 Shift4 Shift5 5 Shift1 Shift2 Shift3 Shift4 Shift5

上表中的日期是实际的字段名称. 我创建了另一个临时表,如下所示:

The dates in above table are actual field names. I have created another temporary table like follows:

EmpID Dates 1 1-Apr-2011 1 2-Apr-2011 1 3-Apr-2011 1 4-Apr-2011 1 5-Apr-2011 2 5-Apr-2011 2 4-Apr-2011 2 3-Apr-2011 2 2-Apr-2011 2 1-Apr-2011 3 1-Apr-2011 3 2-Apr-2011 3 3-Apr-2011 3 4-Apr-2011 3 5-Apr-2011 4 5-Apr-2011 4 4-Apr-2011 4 3-Apr-2011 4 2-Apr-2011 4 1-Apr-2011 5 1-Apr-2011 5 2-Apr-2011 5 3-Apr-2011 5 4-Apr-2011 5 5-Apr-2011

我能够生成上述记录,但是我还需要使用第一个表来生成班次,如下所示:

I am able to generate above records but I also need to generate the shift as well using the first table like follows:

EmpID Dates Shift 1 1-Apr-2011 Shift1 1 2-Apr-2011 Shift2 1 3-Apr-2011 Shift3 1 4-Apr-2011 Shift4 1 5-Apr-2011 Shift5 2 5-Apr-2011 Shift1 2 4-Apr-2011 Shift2 2 3-Apr-2011 Shift3 2 2-Apr-2011 Shift4 2 1-Apr-2011 Shift5 3 1-Apr-2011 Shift1 3 2-Apr-2011 Shift2 3 3-Apr-2011 Shift3 3 4-Apr-2011 Shift4 3 5-Apr-2011 Shift5 4 5-Apr-2011 Shift1 4 4-Apr-2011 Shift2 4 3-Apr-2011 Shift3 4 2-Apr-2011 Shift4 4 1-Apr-2011 Shift5 5 1-Apr-2011 Shift1 5 2-Apr-2011 Shift2 5 3-Apr-2011 Shift3 5 4-Apr-2011 Shift4 5 5-Apr-2011 Shift5

有谁知道我该如何做到这一点. 问候, Gopal

does any body know how can i achieve this. Regards, Gopal

推荐答案

使其更具动态性……可能没有什么可以消除的. 创建表dbo.EmpDate_Shift ( EMPID INT, [2011年4月1日] VARCHAR(50), [2011年4月2日] VARCHAR(50), [2011年4月3日] VARCHAR(50), [2011年4月4日] VARCHAR(50), [2011年4月5日] VARCHAR(50), [2011年4月6日] VARCHAR(50) ) 插入EmpDate_Shift SELECT 1,``Shift1'',``Shift2'',``Shift3'',``Shift4'',``Shift5'',``Shift6'' UNION ALL SELECT 2,``Shift1'',``Shift2'',``Shift3'',``Shift4'',``Shift5'',``Shift6'' UNION ALL SELECT 3,``Shift1'',``Shift2'',``Shift3'',``Shift4'',``Shift5'',``Shift6'' UNION ALL SELECT 4,``Shift1'',``Shift2'',``Shift3'',``Shift4'',``Shift5'',``Shift6'' UNION ALL SELECT 5,''Shift1'',''Shift2'',''Shift3'',''Shift4'',''Shift5'',''Shift6'' 创建表dbo.EmpDate ( EMPID INT, 日期VARCHAR(50) ) 插入EmpDate SELECT 1,``2011年4月1日'' UNION ALL SELECT 1,``2011年4月2日'' UNION ALL SELECT 1,``2011年4月3日'' UNION ALL SELECT 1,``2011年4月4日'' UNION ALL SELECT 1,``2011年4月5日'' UNION ALL SELECT 1,``2011年4月6日'' UNION ALL SELECT 2,``2011年4月1日'' UNION ALL SELECT 2,``2011年4月2日'' UNION ALL SELECT 2,``2011年4月3日'' UNION ALL SELECT 2,``2011年4月4日'' UNION ALL SELECT 2,``2011年4月5日'' UNION ALL SELECT 2,``2011年4月6日'' UNION ALL SELECT 3,``2011年4月1日'' UNION ALL SELECT 3,``2011年4月2日'' UNION ALL SELECT 3,``2011年4月3日'' UNION ALL SELECT 3,``2011年4月4日'' UNION ALL SELECT 3,``2011年4月5日'' UNION ALL SELECT 3,``2011年4月6日'' UNION ALL SELECT 4,``2011年4月1日'' UNION ALL SELECT 4,``2011年4月2日'' UNION ALL SELECT 4,``2011年4月3日'' UNION ALL SELECT 4,``2011年4月4日'' UNION ALL SELECT 4,``2011年4月5日'' UNION ALL SELECT 4,``2011年4月6日'' UNION ALL SELECT 5,``2011年4月1日'' UNION ALL SELECT 5,``2011年4月2日'' UNION ALL SELECT 5,``2011年4月3日'' UNION ALL SELECT 5,``2011年4月4日'' UNION ALL SELECT 5,``2011年4月5日'' UNION ALL SELECT 5,``2011年4月6日'' 选择名称作为日期INTO EmpDateCol FROM在syscolumns中输入ID(在sys.tables中选择object_id,名称=``EmpDate_Shift'') AND ISDate(名称)= 1 创建表dbo.EmpDateShift ( EmpId INT, 日期VARCHAR(25), Shift VARCHAR(25) ) --SELECT *来自EmpDateCol --SELECT * FROM EmpDate --SELECT * FROM EmpDate_Shift 宣告@Sql VARCHAR(8000),@ Val VARCHAR(50) SET @Sql ='''' 从EmpDateCol中选择DECLARE cur_Date游标以选择[Date] OPEN cur_Date 从cur_Date进入@Val 下一个 @@ FETCH_STATUS = 0 开始 SELECT @Sql = @Sql +''SELECT B.EmpID,''''''+ @Val +'''''',C.[''+ @ Val +'']来自EmpDateCol的内部联接Fankarian. .EmpDate B ON CONVERT(Date,A.Date)= CONVERT(Date,B.Dates) 内部联接EmpDate_Shift C ON C.Empid = B.EmpID WHERE CONVERT(Date,B.Dates)= CONVERT(Date,''''''+ @Val +'''''')UNION ALL''+ CHAR( 13) -将INSERT插入EmpDateShift --EXEC(@Sql) 从cur_Date进入@Val 下一个 END CLOSE cur_Date DEALLOCATe cur_Date SET @Sql =左(@ Sql,LEN(@Sql)-10) 插入EmpDateShift EXEC(@Sql) 选择*从EmpDateShift按EmpID排序,日期 删除表EmpDateShift 删除表EmpDate_Shift 删除表EmpDate 删除表EmpDateCol Making it more dynamic...there might be few thing we can eliminate....rite now its just a working idea CREATE TABLE dbo.EmpDate_Shift ( EMPID INT, [01-Apr-2011] VARCHAR(50), [02-Apr-2011] VARCHAR(50), [03-Apr-2011] VARCHAR(50), [04-Apr-2011] VARCHAR(50), [05-Apr-2011] VARCHAR(50), [06-Apr-2011] VARCHAR(50) ) INSERT INTO EmpDate_Shift SELECT 1,''Shift1'',''Shift2'',''Shift3'',''Shift4'',''Shift5'',''Shift6'' UNION ALL SELECT 2,''Shift1'',''Shift2'',''Shift3'',''Shift4'',''Shift5'',''Shift6'' UNION ALL SELECT 3,''Shift1'',''Shift2'',''Shift3'',''Shift4'',''Shift5'',''Shift6'' UNION ALL SELECT 4,''Shift1'',''Shift2'',''Shift3'',''Shift4'',''Shift5'',''Shift6'' UNION ALL SELECT 5,''Shift1'',''Shift2'',''Shift3'',''Shift4'',''Shift5'',''Shift6'' CREATE TABLE dbo.EmpDate ( EMPID INT, Dates VARCHAR(50) ) INSERT INTO EmpDate SELECT 1, ''1-Apr-2011'' UNION ALL SELECT 1, ''2-Apr-2011'' UNION ALL SELECT 1, ''3-Apr-2011'' UNION ALL SELECT 1, ''4-Apr-2011'' UNION ALL SELECT 1, ''5-Apr-2011'' UNION ALL SELECT 1, ''6-Apr-2011'' UNION ALL SELECT 2, ''1-Apr-2011'' UNION ALL SELECT 2, ''2-Apr-2011'' UNION ALL SELECT 2, ''3-Apr-2011'' UNION ALL SELECT 2, ''4-Apr-2011'' UNION ALL SELECT 2, ''5-Apr-2011'' UNION ALL SELECT 2, ''6-Apr-2011'' UNION ALL SELECT 3, ''1-Apr-2011'' UNION ALL SELECT 3, ''2-Apr-2011'' UNION ALL SELECT 3, ''3-Apr-2011'' UNION ALL SELECT 3, ''4-Apr-2011'' UNION ALL SELECT 3, ''5-Apr-2011'' UNION ALL SELECT 3, ''6-Apr-2011'' UNION ALL SELECT 4, ''1-Apr-2011'' UNION ALL SELECT 4, ''2-Apr-2011'' UNION ALL SELECT 4, ''3-Apr-2011'' UNION ALL SELECT 4, ''4-Apr-2011'' UNION ALL SELECT 4, ''5-Apr-2011'' UNION ALL SELECT 4, ''6-Apr-2011'' UNION ALL SELECT 5, ''1-Apr-2011'' UNION ALL SELECT 5, ''2-Apr-2011'' UNION ALL SELECT 5, ''3-Apr-2011'' UNION ALL SELECT 5, ''4-Apr-2011'' UNION ALL SELECT 5, ''5-Apr-2011'' UNION ALL SELECT 5, ''6-Apr-2011'' SELECT Name As Date INTO EmpDateCol FROM syscolumns WHERE id IN (SELECT object_id FROM sys.tables WHERE name = ''EmpDate_Shift'') AND ISDate(Name) = 1 CREATE TABLE dbo.EmpDateShift ( EmpId INT, Dates VARCHAR(25), Shift VARCHAR(25) ) --SELECT * FROM EmpDateCol --SELECT * FROM EmpDate --SELECT * FROM EmpDate_Shift DECLARE @Sql VARCHAR(8000), @Val VARCHAR(50) SET @Sql = '''' DECLARE cur_Date CURSOR FOR SELECT [Date] FROM EmpDateCol OPEN cur_Date FETCH NEXT FROM cur_Date INTO @Val WHILE @@FETCH_STATUS = 0 BEGIN SELECT @Sql = @Sql + ''SELECT B.EmpID,''''''+ @Val + '''''',C.['' + @Val + ''] FROM EmpDateCol A INNER JOIN Fankarian..EmpDate B ON CONVERT(Date,A.Date) = CONVERT(Date,B.Dates) INNER JOIN EmpDate_Shift C ON C.Empid = B.EmpID WHERE CONVERT(Date,B.Dates) = CONVERT(Date,'''''' + @Val + '''''') UNION ALL'' + CHAR(13) --INSERT INTO EmpDateShift --EXEC (@Sql) FETCH NEXT FROM cur_Date INTO @Val END CLOSE cur_Date DEALLOCATe cur_Date SET @Sql = LEFT(@Sql,LEN(@Sql)-10) INSERT INTO EmpDateShift EXEC (@Sql) SELECT * FROM EmpDateShift ORDER BY EmpID, Dates DROP TABLE EmpDateShift DROP TABLE EmpDate_Shift DROP TABLE EmpDate DROP TABLE EmpDateCol

对于您的查询,让我说您"Emp" 的表1和temp表为"EmpDet" .然后尝试以下查询: For your query let me say table 1 of yours "Emp" and temp table as "EmpDet". Then try the following query: SELECT B.*, CASE WHEN B.Dates = '1-Apr-2011' THEN A.[01-Apr-2011] WHEN B.Dates = '2-Apr-2011' THEN A.[02-Apr-2011] WHEN B.Dates = '3-Apr-2011' THEN A.[03-Apr-2011] WHEN B.Dates = '4-Apr-2011' THEN A.[04-Apr-2011] WHEN B.Dates = '5-Apr-2011' THEN A.[05-Apr-2011] END FROM Emp A JOIN EmpDet B ON A.EMPId = B.EMPID

希望这能回答您的问题

Hope this answer your question

您可以使用Unpivot解决此问题,有关详细信息,请参见此 [^ ] 这会很快. You can solve this using Unpivot for details see this[^] this will fast.

更多推荐

如何使这个SQL查询

本文发布于:2023-10-13 10:22:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1487687.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:SQL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!