发布网友
共2个回答
懂视网
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()的使用)
标签:
热心网友
1,场景:根据学生编号查询,返回该学生所在班级的所有学生。支持分页、自定义排序及结果集自动定位到查询条件的学生编号所在页。
复制代码
代码如下:
CREATE
PROC
[dbo].[Sp_testpagerandsorting]
(@GroupID
INT,
@CurrentId
INT,
@TimeFrom
DATETIME,
@TimeTo
DATETIME,
@OrderBy
CHAR(50),
@PageSize
INT,
@CurrentPage
INT)
AS
SET
nocount
ON
BEGIN
DECLARE
@StartNumber
INT,
@EndNumber
INT,
@CurrentIdRowNumber
INT,
@RecordCount
INT,
@EndPageIndex
INT
DECLARE
@RowNumberTable
TABLE
(
rownumber
INT
IDENTITY
(1,
1),
id
INT
)
--step
1:
Build
sort
id
list
-------------------------------------------------------
INSERT
INTO
@RowNumberTable
(id)
SELECT
sm.id
AS
id
FROM
dbo.test
sm
WITH
(nolock)
WHERE
indate
BETWEEN
Coalesce(@TimeFrom,
indate)
AND
Coalesce(@TimeTo,
indate)
AND
sm.groupid
=
@GroupID
ORDER
BY
CASE
WHEN
@OrderBy
=
'InDate
desc'
THEN
(
Row_number()
OVER
(ORDER
BY
indate
DESC))
WHEN
@OrderBy
=
'InDate
asc'
THEN
(Row_number()
OVER
(ORDER
BY
indate
ASC))
WHEN
@OrderBy
=
'Id
asc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.id
ASC))
WHEN
@OrderBy
=
'Id
desc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.id
DESC))
WHEN
@OrderBy
=
'Name
asc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.name
ASC))
WHEN
@OrderBy
=
'Name
desc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.name
DESC)
)
END
--step
2:
Reset
page
index
with
current
id
-----------------------------------------
IF
@CurrentIdNumber
>
0
BEGIN
SELECT
TOP
1
@CurrentIdRowNumber
=
rownumber
FROM
@RowNumberTable
WHERE
id
=
@CurrentIdNumber
IF
@CurrentIdRowNumber
>
0
BEGIN
IF
@CurrentPage
=
0
BEGIN
SET
@CurrentPage
=
Ceiling(CAST(@CurrentIdRowNumber
AS
DECIMAL)
/
CAST
(@PageSize
AS
DECIMAL))
END
END
END
ELSE
BEGIN
IF
@CurrentPage
=
0
BEGIN
SET
@CurrentPage
=
1
END
END
--step
3:
Set
recordCount
-----------------------------------------
SELECT
@RecordCount
=
COUNT(1)
FROM
@RowNumberTable
--step
4:
Calc
startNumber
&
endNumber
-----------------------------------------
SELECT
@StartNumber
=
@PageSize
*
(
@CurrentPage
-
1
),
@EndNumber
=
@PageSize
*
(
@CurrentPage
-
1
)
+
@pageSize,
@EndPageIndex
=
Ceiling(CAST(@RecordCount
AS
DECIMAL)
/
CAST(@PageSize
AS
DECIMAL))
IF
@CurrentPage
=
@EndPageIndex
BEGIN
SET
@EndNumber
=
@RecordCount
END
--step
5:
Get
sorted
id
of
current
page
-----------------------------------------
;WITH
a
AS
(SELECT
TOP
(@EndNumber
-
@StartNumber)
id,
rownumber
FROM
(SELECT
TOP
(@EndNumber)
id,
rownumber
FROM
@RowNumberTable)
AS
b
ORDER
BY
rownumber
DESC)
--step
6:
Return
current
page
idList
-------------------------------------------------------
SELECT
[ID],
[GroupID]
[Name],
[Address]
FROM
dbo.test
sm
WITH(nolock)
INNER
JOIN
a
ON
a.id
=
sm.id
ORDER
BY
a.rownumber
--
step
7:return
current
page
&
record
count
----------------------------------
SELECT
@CurrentPage
AS
currentpage,
@RecordCount
AS
recordcount
END
2,简单条件的,动态where语句(关于Like查询的动态where,建议使用笨办法做)
复制代码
代码如下:
CREATE
PROC
[dbo].[Getstudentlistbycondition]
@Name
NVARCHAR(20),
@Class
INT
AS
SET
nocount
ON
BEGIN
BEGIN
SELECT
[Name],
[class]
FROM
[testtable]
WHERE
[Class]
=
CASE
WHEN
@Class
>
0
THEN
@Class
ELSE
[Class]
END
AND
[name]
=
CASE
WHEN
@Name
<>
''
THEN
@Name
ELSE
[Name]
END
END
END