如何使这个SQL查询 [英] how to make this sql query
本文介绍了如何使这个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查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文