发布网友 发布时间:2022-04-22 13:51
共6个回答
懂视网 时间:2022-04-08 22:18
BEGIN TRAN
CREATE TABLE [dbo].[CarData](
[CarID] [int] NULL,
[Mileage] [int] NULL,
[M_year] [int] NULL,
[M_Month] [int] NULL,
[M_Day] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 10, 2015, 1, 1)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 15, 2015, 1, 2)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 15, 2015, 1, 5)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 20, 2015, 1, 6)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 26, 2015, 1, 9)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 30, 2015, 1, 10)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 35, 2015, 1, 11)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 20, 2015, 1, 5)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 22, 2015, 1, 8)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 40, 2015, 1, 10)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 45, 2015, 1, 11)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (3, 50, 2015, 1, 11)
ROLLBACK
--使用Sql语句,统计出每辆汽车每天行驶的里程数(不是总里程)
--关键点:如何上一条记录,有rowNum之类的函数没?有! row_number()
--按照carID排序后,进行rowNum
SELECT ROW_NUMBER() OVER (order by c.carID ) as rowNum,c.* FROM CarData c
--按照carID分组后
SELECT c.CarID, ROW_NUMBER() OVER (PARTITION by c.CarID ORDER BY c.M_year,c.M_Month,c.M_Day) as RowNum ,c.Mileage FROM CarData c
--博友答案
WITH TWO AS(
SELECT ROW_NUMBER() OVER(PARTITION BY CarId ORDER BY CarId, M_Year, M_Month, M_Day) AS NodeId
,C.CarId
,C.Mileage
,C.M_Year
,C.M_Month
,C.M_Day
FROM cardata AS C
)
SELECT A.*
, A.Mileage - COALESCE(B.NextMileage, 0) AS ‘增量‘
FROM TWO AS A
OUTER APPLY (SELECT Mileage AS NextMileage FROM TWO AS B WHERE B.NodeId = A.NodeId - 1 AND B.CarId = A.CarId ) AS B;
---补充知识 函数COALESCE
--说明 至少应有一个参数为 NULL 类型。,返回第一个非NUll类型的值
select COALESCE(null,null);
SELECT COALESCE(NULL,NULL,GETDATE());
SELECT COALESCE(NULL,0);
SQLServer的学习场景(关于row_number()和COALESCE()的使用)
标签:
热心网友 时间:2022-04-08 19:26
这样:
SELECT
a.dt AS '时间',
ISNULL(b.yield, '0') AS '数据'
FROM
(
SELECT
dateadd(d, number, '2018-11-01') dt
FROM
master..spt_values
WHERE
type = 'p'
AND dateadd(d, number, '2018-11-01') <= '2018-11-30'
) a
LEFT JOIN CE_BD_E_ELECTRIC_WORKSHIFT_T b ON a.dt = b.opdate
注意事项
COALESCE是一个函数, (expression_1, expression_2, …,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。
场景一:你想要获取最大值,然后+1返回(即返回的值已经默认为空了),程序接收了本来不该为空的值去运算,就会出错。
SELECT MAX(my_money)+1 FROM tb_test;
改进方法:使用 coalesce函数 COALESCE(值1, 值2,......, 值n) ,只要遇到非null值就返回。
这样子就可以设置一个值,让你第一个不成功后,返回指定的值,如下面,返回的是1.
SELECT COALESCE(MAX(my_money)+1, 1) FROM tb_test;
热心网友 时间:2022-04-08 20:44
如果是SQLServer数据库可以使用ISNULL()函数
例如:
--这是临时变量表效果图如下:
参考资料
了解更多关于ISNULL函数用法,可访问下面连接
http://www.w3school.com.cn/sql/sql_isnull.asp
追问这种方法不行哦,因为我查的数据数据库里是没有的所以他不是null而是没有那条记录追答
如果是空数据,返回0。你只能通过相应的程序判断,或者sql判断无法用一个查询,如果是空返回0的。
例如类似:
if exists(select 1 from 表名 where 条件语句)
热心网友 时间:2022-04-08 22:19
可以使用ISNULL()函数
列如
效果图如下
追问很明确的说isnull不行,他针对的是查询出来的数据为null的时候可以,但是我查的是数据库里都没有那条记录,返回回来的数据就不是null了是空没有数据
热心网友 时间:2022-04-09 00:10
我今天也遇到这类问题了,
解决问题的关键不是从原SQL上改进,而是嵌套一层!
热心网友 时间:2022-04-09 02:18
update table set sex=0 where sex is null