这个查询语句应该怎么写????

draculamx 2018-10-30 10:02:33
有一张表,记录了所有项目的名称,和他们的ID号:

id itemname itemid
0 温度 0
1 湿度 1
2 风速 2

另一张表,记录了每个项目的数值:

id value itemid rectime
0 10 0 2017-12-19 08:00:00
1 80 1 2017-12-19 08:00:00
2 12 2 2017-12-19 08:00:00

现在要查询,查询的结果如下:

ID 温度 湿度 风速 记录时间
0 10 80 12 2017-12-19 08:00:00

这个查询要怎么写?这个查询中的“ID”要怎么弄?因为它本身是不存在的,只存在于这个查询中,并不在某个具体的表里面

我也知道单独设计一张表最简单:

id 风速 温度 湿度 记录时间
0 10 12 80 2017-12-19 08:00:00

只用一张表,最简单,但是如果以后遇到数据的增加或者减少,比如增加一个检测项目“MP2.5”,这个表就没用了,但是如果使用我开头的设计,就很难查询。。。
...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2018-11-01
  • 打赏
  • 举报
回复
试试楼上的代码;
测试数据尽量给全,不然写出来的代码也会比较片面,数据越全代码越准确。
二月十六 2018-11-01
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([id] int,[itemname] nvarchar(22),[itemid] int)
Insert #T1
select 0,N'温度',0 union all
select 1,N'湿度',1 union all
select 2,N'风速',2
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([id] int,[value] int,[itemid] int,[rectime] DATETIME)
Insert #T2
select 1,10,0,N'2017-12-19 08:00:00' union all
select 2,80,1,N'2017-12-19 08:00:00' union all
select 3,12,2,N'2017-12-19 08:00:00' union all
select 4,15,0,N'2017-12-19 09:00:00' union all
select 5,60,1,N'2017-12-19 09:00:00' union all
select 6,21,2,N'2017-12-19 09:00:00' union all
select 7,31,0,N'2017-12-19 10:00:00' union all
select 8,45,1,N'2017-12-19 10:00:00' union all
select 9,65,2,N'2017-12-19 10:00:00'
Go
--测试数据结束
;WITH cte AS (
SELECT
itemname,
value,
rectime,
DENSE_RANK() OVER (
ORDER BY
rectime
) rn
FROM
#T1
JOIN
#T2
ON #T2.itemid = #T1.itemid
)
SELECT
rn AS id,
MAX( CASE cte.itemname
WHEN '风速 '
THEN cte.value
ELSE
0
END
) 风速 ,
MAX( CASE cte.itemname
WHEN '温度'
THEN cte.value
ELSE
0
END
) 温度,
MAX( CASE cte.itemname
WHEN '湿度'
THEN cte.value
ELSE
0
END
) 湿度,
rectime
FROM
cte
GROUP BY rn,rectime


draculamx 2018-11-01
  • 打赏
  • 举报
回复
一楼的答案是我要表达的意思。、
二楼和三楼的兄弟可能以为第二张表只有这些数据,其实第二张表是有很多记录的,我再详细一点:

id value itemid rectime
1 10 0 2017-12-19 08:00:00
2 80 1 2017-12-19 08:00:00
3 12 2 2017-12-19 08:00:00
4 15 0 2017-12-19 09:00:00
5 60 1 2017-12-19 09:00:00
6 21 2 2017-12-19 09:00:00
7 31 0 2017-12-19 10:00:00
8 45 1 2017-12-19 10:00:00
9 65 2 2017-12-19 10:00:00

也就是说,表一:
id itemname itemid
0 温度 0
1 湿度 1
2 风速 2

中的,温度,湿度,风速,24小时中,每小时都会记录一次,那么查询的结果就应该是

ID 温度 湿度 风速 记录时间
1 10 80 12 2017-12-19 08:00:00
2 15 60 21 2017-12-19 09:00:00
3 31 45 65 2017-12-19 10:00:00

RINK_1 2018-10-31
  • 打赏
  • 举报
回复

SELECT ROW_NUMBER() OVER (ORDER BY A.RECTIME)-1 AS ID,
A.rectime,
MAX(CASE WHEN itemname='温度' THEN VALUE ELSE 0 END) AS 温度,
MAX(CASE WHEN itemname='湿度' THEN VALUE ELSE 0 END) AS 湿度,
MAX(CASE WHEN itemname='风速' THEN VALUE ELSE 0 END) AS 风速
FROM
(SELECT RECTIME,itemid,itemname
FROM 
(SELECT DISTINCT RECTIME FROM TABLE_2) AS B
CROSS JOIN
TABLE_1 A) AS A
LEFT JOIN TABLE_2 B ON A.itemid=B.itemid AND A.rectime=B.rectime
GROUP BY A.rectime
二月十六 2018-10-31
  • 打赏
  • 举报
回复
按照给的数据写的,可能和实际情况不太一样,如果不适用,给出更多测试数据和对应结果
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([id] int,[itemname] nvarchar(22),[itemid] int)
Insert #T1
select 0,N'温度',0 union all
select 1,N'湿度',1 union all
select 2,N'风速',2
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([id] int,[value] int,[itemid] int,[rectime] DATETIME)
Insert #T2
select 0,10,0,N'2017-12-19 08:00:00' union all
select 1,80,1,N'2017-12-19 08:00:00' union all
select 2,12,2,N'2017-12-19 08:00:00'
Go
--测试数据结束
;WITH cte AS (
SELECT
itemname,
value,
rectime,
DENSE_RANK() OVER (PARTITION BY
rectime
ORDER BY
rectime
) - 1 rn
FROM
#T1
JOIN
#T2
ON #T2.itemid = #T1.itemid
)
SELECT
rn AS id,
MAX( CASE cte.itemname
WHEN '风速 '
THEN cte.value
ELSE
0
END
) 风速 ,
MAX( CASE cte.itemname
WHEN '温度'
THEN cte.value
ELSE
0
END
) 温度,
MAX( CASE cte.itemname
WHEN '湿度'
THEN cte.value
ELSE
0
END
) 湿度,
rectime
FROM
cte
GROUP BY rn,rectime



吉普赛的歌 2018-10-30
  • 打赏
  • 举报
回复
--原始表 id 风速 温度 湿度 记录时间 1 10 12 80 2017-12-19 08:00:00 2 2 22 10 2017-12-20 08:00:00 --增加项 itemId id itemName itemValue 1 1 风向 东 2 1 穿衣指数 厚外套 3 2 风向 西 4 2 穿衣指数 外套 对于比较固定的项, 直接写在表中, 不要犹豫。 哪天你不用了, 也无所谓, 程序中不显示这个字段就可以了。 增加项用一个比较灵活的表, 到时候两者拼一下就行。 可以参考: https://blog.csdn.net/yenange/article/details/79425174

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧