sql查询,用于根据两个表中的日期和月份进行检索。 [英] sql query for Retrieving based on date and month from two tables.

查看:55
本文介绍了sql查询,用于根据两个表中的日期和月份进行检索。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

TABLE1

(解析数据)
数据包a S_ID c yy MM DD Hr Min sec
1080200062412220130505170801 1080 20006 24122 2013 05 05 17 08 01
1080200062412320130505171628 1080 20006 24123 2013 05 05 17 16 28
1080200062412420130505172121 1080 20006 24124 2013 05 05 17 21 21
1080200062412520130508172512 1080 20006 24125 2013 05 08 17 25 12
1080200062412620130508173013 1080 20006 24126 2013 05 08 17 30 13
1080200062412720130509174002 1080 20006 24127 2013 05 09 17 40 02
1080200062412820130509174935 1080 20006 24128 2013 05 09 17 49 35
1080200062412920130510180010 1080 20006 24129 2013 05 10 18 00 10
1080200072413020130510180627 1080 20007 24130 2013 05 10 18 06 27
1080200072413120130510181255 1080 20007 24131 2013 05 10 18 12 55
10802000 72413220130510181948 1080 20007 24132 2013 05 10 18 19 48
1080200072413320130510182836 1080 20007 24133 2013 05 10 18 28 36
1080200072413420130511183826 1080 20007 24134 2013 05 11 18 38 26
1080200072413520130511184803 1080 20007 24135 2013 05 11 18 48 03
1080200072413620130511185616 1080 20007 24136 2013 05 11 18 56 16
1080200082413620130511185616 1080 20008 24136 2013 05 11 18 56 16
1080200072413620130603185616 1080 20007 24136 2013 06 03 18 56 16
1080200082413620130604185616 1080 20008 24136 2013 06 04 18 56 16



TABLE2

 s_Id中心区
20005 Tirupati Municpal办公室
20006 Madanapalli Chittoor
20007 Bowenpally Hyderabad
20008 MR Palli Chittoor
20010 Sree Kalahathi Chittoor

我想根据MM(月)报告和DD(日期).O / P喜欢Bellow格式

中心区S_ID 5月6月
Su Mon Th Th Fr Sa Sa Mon Th Th Th Th Fr Sa
5 6 7 8 9 10 11 2 3 4 5 6 7 8

Madanapalli Chittoor 20006 3 0 0 5 2 1 0
Bowenpally Hyderabad 20007 0 0 0 0 0 4 3 0 1 0 0 0 0 0
MR Palli Chittoor 20008 0 0 0 0 0 0 1 0 0 1 0 0 0 0

解决方案

请阅读我对这个问题的评论。



有可能使用清晰的T-SQL语言来实现这一点,但是有一点不同的输出。看看:

   -   声明临时表数据 - > table1  
CREATE TABLE #tbl1(Packet VARCHAR 255 ), INT ,S_ID INT ,c INT ,[yy] INT ,[MM] < span class =code-keyword> INT ,[DD] INT ,[Hr] INT ,[Min] INT ,[sec] INT
- 插入数据
INSERT INTO #tbl1(数据包,a,S_ID,c,[yy],[MM],[DD],[Hr],[Min],[sec])
SELECT ' 1080200062412220130505170801' AS 数据包, 1080 AS a, 20006 AS S_ID, 24122 AS c, 2013 AS [yy], 05 < span class =code-keyword> AS [MM], 05 AS [DD ], 17 AS [Hr], 08 AS [Min], 01 AS [秒]
UNION 所有 SELECT ' 1080200062412320130505171628' 1080 20006 24123 2013 05 05 17 16 28
UNION ALL SELECT ' 1080200062412420130505172121' 1080 20006 24124 ,< span class =code-digit> 2013 , 05 05 17 21 21
UNION ALL SELECT ' 1080200062412520130508172512' 1080 20006 24125 2013 05 08 17 25 12
UNION 所有 SELECT ' 1080200062412620130508173013' 1080 20006 24126 2013 05 08 17 ,< span class =code-digit> 30 , 13
UNION < span class = code-keyword> ALL SELECT ' 1080200062412720130509174002' 1080 20006 24127 2013 05 09 17 40 02
UNION ALL SELECT < span class =code-string>' 1080200062412820130509174935' 1080 20006 24128 2013 05 09 17 49 35
UNION ALL SELECT ' 1080200062412920130510180010' 1080 20006 24129 2013 05 10 18 00 10
UNION ALL SELECT ' 1080200072413020130510180627' 1080 20007 24130 2013 05 10 18 06 27
UNION ALL SELECT ' 1080200072413120130510181255' 1080 20007 24131 2013 05 10 18 12 55
UNION ALL SELECT ' 1080200072413220130510181948' 1080 20007 24132 2013 05 10 18 19 48
UNION ALL SELECT ' 1080200072413320130510182836' 1080 20007 24133 ,< span class =code-digit> 2013 , 05 10 18 28 36
UNION ALL SELECT ' 1080200072413420130511183826' 1080 20007 24134 2013 05 11 18 38 26
UNION ALL SELECT ' 1080200072413520130511184803' 1080 20007 24135 2013 05 11 18 48 03
UNION ALL SELECT ' 1080200072413620130511185616' 1080 20007 24136 2013 05 11 18 56 16
UNION ALL SELECT ' 1080200082413620130511185616' 1080 20008 24136 2013 05 11 18 56 16
UNION ALL SELECT ' 1080200072413620130603185616' 1080 20007 24136 2013 06 03 18 56 16
UNION ALL SELECT < span class =code-string>' 1080200082413620130604185616' 1080 20008 24136 2013 06 04 18 56 16
- 为table2声明临时表
CREATE TABLE #tbl2(s_Id INT ,中心 VARCHAR 30 ),区 VARCHAR 30 ))
- 插入数据
INSERT INTO #tbl2(s_Id,中心,区)
SELECT 20005 AS s_Id,' Tirupati Municpal' AS 中心,' Office' AS
UNION 所有 SELECT 20006 ' Madanapalli'' Chittoor'
< span class =code-keyword> UNION ALL SELECT 20007 ' Bowenpally'' Hyderabad'
UNION ALL SELECT 20008 ' MR Palli'' Chittoor'
UNION ALL SELECT 20010 ' Sree Kalahathi' ' Chittoor'
- 声明表变量以存储日期(以创建动态列)
CREATE #dates(mydate DATETIME
- 插入日期
INSERT INTO #dates(mydate)
SELECT DISTINCT CONVERT DATETIME CONVERT VARCHAR ,t1.yy)+ ' /' + CONVERT VARCHAR ,t1.MM)+ ' /' + CONVERT VARCHAR ,t1.DD))
FROM #tbl1 AS t1
ORDER BY CONVERT DATETIME CONVERT VARCHAR , t1.yy)+ ' /' + CONVERT (<跨度class =code-keyword> VARCHAR ,t1.MM)+ ' /' + CONVERT VARCHAR ,t1.DD))
- 声明变量以存储列名
DECLARE @cols NVARCHAR 200
< span class =code-comment> - 从日期获取列
SET @cols = STUFF(( SELECT DISTINCT ' ],[' + CONVERT VARCHAR 10 ),mydate, 120
FROM #dates
FOR XML PATH(' ')), 1 2 ' ')+ ' ]'
- 声明变量:
- 临时表来存储数据
DECLARE @ dt VARCHAR 2000
- temporrary枢轴表;)
DECLARE @ pt VARCHAR (MAX)
- 构建查询
SET @ dt = ' SELECT t2.Center,t2.District,t1.c,t1.S_Id,CONVERT(DATETIME,CONVERT(VARCHAR,t1.yy)+''/''+ CONVERT(VARCHAR,t1.MM)+''/' '+ CONVERT(VARCHAR,t1.DD))AS mydate' +
' FROM# tbl1 AS t1 INNER JOIN#tbl2 AS t2 ON t1.S_Id = t2.s_Id'
- EXEC(@dt)
- build pivot table
SET @ pt = ' < span class =code-string> SELECT Center,District,S_Id,'
+ @cols + ' ' +
' FROM(' + @ dt + ' )AS DT' +
' PIVOT(COUNT(c)FOR [mydate] IN(' + @cols + ' ))AS PT'
- exec pivot
EXEC @ pt
- 清理;)
DROP #tbl1
DROP #tbl2
DROP #d ates





结果:

中心区S_Id [2013-05- 05] [2013-05-08] [2013-05-09] [2013-05-10] [2013-05-11] [2013-06-03] [2013-06-04] 
Bowenpally Hyderabad 20007 0 0 0 4 3 1 0
Madanapalli Chittoor 20006 3 2 2 1 0 0 0
MR Palli Chittoor 20008 0 0 0 0 1 0 1


TABLE1

                                          (Parsing Data)
          Packet               a    S_ID    c      yy   MM  DD  Hr  Min sec 
1080200062412220130505170801  1080  20006  24122  2013  05  05  17  08  01 
1080200062412320130505171628  1080  20006  24123  2013  05  05  17  16  28 
1080200062412420130505172121  1080  20006  24124  2013  05  05  17  21  21 
1080200062412520130508172512  1080  20006  24125  2013  05  08  17  25  12 
1080200062412620130508173013  1080  20006  24126  2013  05  08  17  30  13 
1080200062412720130509174002  1080  20006  24127  2013  05  09  17  40  02 
1080200062412820130509174935  1080  20006  24128  2013  05  09  17  49  35 
1080200062412920130510180010  1080  20006  24129  2013  05  10  18  00  10 
1080200072413020130510180627  1080  20007  24130  2013  05  10  18  06  27 
1080200072413120130510181255  1080  20007  24131  2013  05  10  18  12  55 
1080200072413220130510181948  1080  20007  24132  2013  05  10  18  19  48 
1080200072413320130510182836  1080  20007  24133  2013  05  10  18  28  36 
1080200072413420130511183826  1080  20007  24134  2013  05  11  18  38  26 
1080200072413520130511184803  1080  20007  24135  2013  05  11  18  48  03 
1080200072413620130511185616  1080  20007  24136  2013  05  11  18  56  16 
1080200082413620130511185616  1080  20008  24136  2013  05  11  18  56  16 
1080200072413620130603185616  1080  20007  24136  2013  06  03  18  56  16 
1080200082413620130604185616  1080  20008  24136  2013  06  04  18  56  16 


TABLE2

s_Id      Center                   District
20005	Tirupati Municpal          Office	
20006	Madanapalli	           Chittoor	
20007	Bowenpally	           Hyderabad	
20008	MR Palli                   Chittoor 
20010	Sree Kalahathi             Chittoor

i want report based on MM(Month) and DD(Date).O/P Like Bellow Format

Center       District   S_ID             May                         June     
                                Su  Mon  Th  We  Th  Fr  Sa    Su  Mon  Th  We  Th  Fr  Sa
                                5   6    7   8   9   10  11    2   3    4   5   6   7   8 

Madanapalli  Chittoor   20006   3   0    0   5   2   1   0         
Bowenpally   Hyderabad  20007   0   0    0   0   0   4   3     0   1    0   0   0   0   0
MR Palli     Chittoor   20008   0   0    0   0   0   0   1     0   0    1   0   0   0   0

解决方案

Please, read my comments to the question.

There is possible to achieve that using clear T-SQL language, but with a liitle bit different output. Have a look:

--declare temporary table for data -> table1
CREATE TABLE #tbl1 (Packet VARCHAR(255), a INT, S_ID INT, c INT, [yy] INT, [MM] INT, [DD] INT, [Hr] INT, [Min] INT, [sec] INT)
--insert data
INSERT INTO #tbl1 (Packet, a, S_ID, c, [yy], [MM], [DD], [Hr], [Min], [sec])
SELECT '1080200062412220130505170801' AS Packet, 1080 AS a, 20006 AS S_ID, 24122 AS c, 2013 AS [yy], 05 AS [MM], 05 AS [DD], 17 AS [Hr], 08 AS [Min], 01 AS [sec]
UNION ALL SELECT '1080200062412320130505171628', 1080, 20006, 24123, 2013, 05, 05, 17, 16, 28 
UNION ALL SELECT '1080200062412420130505172121', 1080, 20006, 24124, 2013, 05, 05, 17, 21, 21 
UNION ALL SELECT '1080200062412520130508172512', 1080, 20006, 24125, 2013, 05, 08, 17, 25, 12 
UNION ALL SELECT '1080200062412620130508173013', 1080, 20006, 24126, 2013, 05, 08, 17, 30, 13 
UNION ALL SELECT '1080200062412720130509174002', 1080, 20006, 24127, 2013, 05, 09, 17, 40, 02 
UNION ALL SELECT '1080200062412820130509174935', 1080, 20006, 24128, 2013, 05, 09, 17, 49, 35 
UNION ALL SELECT '1080200062412920130510180010', 1080, 20006, 24129, 2013, 05, 10, 18, 00, 10 
UNION ALL SELECT '1080200072413020130510180627', 1080, 20007, 24130, 2013, 05, 10, 18, 06, 27 
UNION ALL SELECT '1080200072413120130510181255', 1080, 20007, 24131, 2013, 05, 10, 18, 12, 55 
UNION ALL SELECT '1080200072413220130510181948', 1080, 20007, 24132, 2013, 05, 10, 18, 19, 48 
UNION ALL SELECT '1080200072413320130510182836', 1080, 20007, 24133, 2013, 05, 10, 18, 28, 36 
UNION ALL SELECT '1080200072413420130511183826', 1080, 20007, 24134, 2013, 05, 11, 18, 38, 26 
UNION ALL SELECT '1080200072413520130511184803', 1080, 20007, 24135, 2013, 05, 11, 18, 48, 03 
UNION ALL SELECT '1080200072413620130511185616', 1080, 20007, 24136, 2013, 05, 11, 18, 56, 16 
UNION ALL SELECT '1080200082413620130511185616', 1080, 20008, 24136, 2013, 05, 11, 18, 56, 16 
UNION ALL SELECT '1080200072413620130603185616', 1080, 20007, 24136, 2013, 06, 03, 18, 56, 16 
UNION ALL SELECT '1080200082413620130604185616', 1080, 20008, 24136, 2013, 06, 04, 18, 56, 16 
--declare temporary table for table2
CREATE TABLE #tbl2 (s_Id INT, Center VARCHAR(30), District VARCHAR(30))
--insert data
INSERT INTO #tbl2 (s_Id, Center, District)
SELECT 20005 AS s_Id, 'Tirupati Municpal' AS Center, 'Office' AS District
UNION ALL SELECT 20006, 'Madanapalli', 'Chittoor'
UNION ALL SELECT 20007, 'Bowenpally', 'Hyderabad'	
UNION ALL SELECT 20008, 'MR Palli', 'Chittoor'
UNION ALL SELECT 20010, 'Sree Kalahathi', 'Chittoor'
--declare table variable to store dates (to create dynamic columns)
CREATE TABLE #dates (mydate DATETIME)
--insert dates
INSERT INTO #dates (mydate)
SELECT DISTINCT CONVERT(DATETIME, CONVERT(VARCHAR,t1.yy) + '/' + CONVERT(VARCHAR,t1.MM) + '/' + CONVERT(VARCHAR,t1.DD))
FROM #tbl1 AS t1
ORDER BY CONVERT(DATETIME, CONVERT(VARCHAR,t1.yy) + '/' + CONVERT(VARCHAR,t1.MM) + '/' + CONVERT(VARCHAR,t1.DD))
--declare variable to store column names
DECLARE @cols NVARCHAR(200)
--get columns from dates
SET @cols = STUFF((SELECT DISTINCT '],[' + CONVERT(VARCHAR(10),mydate,120) 
			FROM #dates
			FOR XML PATH('')),1,2,'') + ']'
--declare variable:
--temporary table to store data 
DECLARE @dt VARCHAR(2000)
--temporrary table for pivot ;)
DECLARE @pt VARCHAR(MAX)
--build query 
SET @dt = 'SELECT t2.Center, t2.District, t1.c, t1.S_Id, CONVERT(DATETIME, CONVERT(VARCHAR,t1.yy) + ''/'' + CONVERT(VARCHAR,t1.MM) + ''/'' + CONVERT(VARCHAR,t1.DD)) AS mydate ' +
		'FROM #tbl1 AS t1 INNER JOIN #tbl2 AS t2 ON t1.S_Id = t2.s_Id'
--EXEC(@dt)
--build pivot table
SET @pt = 'SELECT Center, District, S_Id, ' + @cols + ' ' +
			'FROM (' + @dt + ') AS DT ' +
			'PIVOT(COUNT(c) FOR [mydate] IN(' + @cols + ')) AS PT'
--exec pivot 
EXEC(@pt)
--clean up ;)
DROP TABLE #tbl1
DROP TABLE #tbl2
DROP TABLE #dates



Result:

Center          District        S_Id    [2013-05-05]	[2013-05-08]	[2013-05-09]	[2013-05-10]	[2013-05-11]	[2013-06-03]	[2013-06-04]
Bowenpally	Hyderabad	20007	0		0		0		4		3		1		0
Madanapalli	Chittoor	20006	3		2		2		1		0		0		0
MR Palli	Chittoor	20008	0		0		0		0		1		0		1


这篇关于sql查询,用于根据两个表中的日期和月份进行检索。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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