如何使这个SQL查询 [英] how to make this sql query

查看:89
本文介绍了如何使这个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆