sql查询,用于根据两个表中的日期和月份进行检索。 [英] sql query for Retrieving based on date and month from two tables.
本文介绍了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 温泉n>数据包, 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屋!
查看全文