Sql server 基于早期结果获取Sql集中的下一个关联记录结果
早上好 我被要求做一份关于轮胎更换和车辆检查的报告 我把不同的部分贴在柱子的底部 但我基本上要做的是找出一个轮胎在资产上的特定位置有多长时间,以及它被安装的时间与另一个轮胎被替换的时间之间的差异等等 我甚至不知道从哪里开始这个查询,因为我对sql server一般都是新手 我的sql表是Sql server 基于早期结果获取Sql集中的下一个关联记录结果,sql-server,Sql Server,早上好 我被要求做一份关于轮胎更换和车辆检查的报告 我把不同的部分贴在柱子的底部 但我基本上要做的是找出一个轮胎在资产上的特定位置有多长时间,以及它被安装的时间与另一个轮胎被替换的时间之间的差异等等 我甚至不知道从哪里开始这个查询,因为我对sql server一般都是新手 我的sql表是 CREATE TABLE assets_tyre_change_header ( id INT NOT NULL IDENTITY(1,1), change_date date not null,
CREATE TABLE assets_tyre_change_header
( id INT NOT NULL IDENTITY(1,1),
change_date date not null,
asset_id varchar(50) not null,
odometer_hour varchar(50),
completed tinyint,
comment text,
CONSTRAINT assets_tyre_change_pk PRIMARY KEY (id)
);
CREATE TABLE assets_tyre_change_details
( id INT NOT NULL IDENTITY(1,1),
tyre_change_id INT,
tyre_id varchar(50) not null,
wheel_position varchar(50) not null,
tread_depth int not null,
minimum_depth int not null
CONSTRAINT assets_tyre_change_detail_pk PRIMARY KEY (id)
);
create table assets_tyre_inspection_header
( id INT NOT NULL IDENTITY(1,1),
inspection_date date not null,
asset_id varchar(50) not null,
odometer_hour varchar(50),
completed tinyint,
comment text,
CONSTRAINT assets_tyre_inspection_pk PRIMARY KEY (id)
);
CREATE TABLE assets_tyre_inspection_details
( id INT NOT NULL IDENTITY(1,1),
tyre_inspection_id INT,
tyre_id varchar(50) not null,
wheel_position varchar(50) not null,
tread_depth int not null
CONSTRAINT assets_tyre_inspection_detail_pk PRIMARY KEY (id)
);
我的下一步是从这些表中提取基本细节作为结果表
sql附加
select * from (
(select 'change' as type,
tyre_id,
asset_id,
wheel_position,
min(convert(int,odometer_hour))as min_oh,
max(convert(int,odometer_hour))as max_oh,
min(tread_depth)as min_depth,
min(change_date) as transdate
from assetsandfuel.dbo.assets_tyre_change_details as c_details
join assetsandfuel.dbo.assets_tyre_change_header as c_header on c_header.id = c_details.tyre_change_id
group by asset_id,tyre_id,wheel_position
)
union
(select 'inspect' as type,
tyre_id,
asset_id,
wheel_position,
min(convert(int,odometer_hour))as min_oh,
max(convert(int,odometer_hour))as max_oh,
min(tread_depth)as min_depth,
min(inspection_date) as transdate
from assetsandfuel.dbo.assets_tyre_inspection_details as i_details
join assetsandfuel.dbo.assets_tyre_inspection_header as i_header on i_header.id = i_details.tyre_inspection_id
group by asset_id,tyre_id,wheel_position
)
)as report_table
order by transdate;
这将导致以下记录作为表格结果交付
type tyre asset position min max depth transdate
change T001 TestV 4 1489 1489 15 2016-04-01
change T002 TestV 6 1489 1489 15 2016-04-01
change F146 Forklift001 3 6900 6900 30 2016-04-02
change F147 Forklift001 2 6900 6900 30 2016-04-02
change T001 TestV 6 2800 2800 12 2016-04-08
change T002 TestV 4 2800 2800 10 2016-04-08
change T003 TestV 12 2800 2800 15 2016-04-08
inspect F146 Forklift001 3 6920 6920 27 2016-04-09
inspect F147 Forklift001 2 6920 6920 15 2016-04-09
inspect T001 TestV 6 3400 3400 9 2016-04-10
inspect T003 TestV 12 3400 3400 12 2016-04-10
change F148 Forklift001 1 6950 6950 30 2016-04-11
change F149 Forklift001 4 6950 6950 30 2016-04-11
非常感谢。我正在尝试编辑它以插入我的检查表。但到目前为止,前景看好。我会让你知道结果的
/* Using set up below
Generate a row number to sequence tyre changes and then join each row to the next row*/
SELECT TC1.Type, tc1.tyre_id as Tyre, tc1.asset_id as Asset, tc1.wheel_position as Position,
tc1.MINOH as 'Min', tc2.oh as 'Max', cast(tc2.oh as int) - cast(tc1.minoh as int) as 'Time in Wheel Position',
tc1.tread_depth, tc1.trandate
FROM
(
SELECT 'Change' as Type,TH.id AS THID, TH.change_date TRANDATE,TH.asset_id,TH.odometer_hour MINOH,TH.completed,TH.comment,
TD.id AS TDID, TD.tyre_change_id,TD.tyre_id,TD.wheel_position,TD.tread_depth,TD.minimum_depth
,ROW_NUMBER() OVER(PARTITION BY TH.ASSET_ID ORDER BY TD.TYRE_ID ,TH.ID) AS ROWNUMBER
FROM [dbo].[assets_tyre_change_header] TH
JOIN [dbo].[assets_tyre_change_details] TD ON TD.TYRE_CHANGE_ID = TH.ID
) TC1
LEFT JOIN
(
SELECT 'Change' as Type , TH.id AS THID, TH.change_date TRANDATE,TH.asset_id,TH.odometer_hour OH,TH.completed,TH.comment,
TD.id AS TDID, TD.tyre_change_id,TD.tyre_id,TD.wheel_position,TD.tread_depth,TD.minimum_depth
,ROW_NUMBER() OVER(PARTITION BY TH.ASSET_ID ORDER BY TD.TYRE_ID ,TH.ID) AS ROWNUMBER
FROM [dbo].[assets_tyre_change_header] TH
JOIN [dbo].[assets_tyre_change_details] TD ON TD.TYRE_CHANGE_ID = TH.ID
) TC2
ON TC2.ASSET_ID = TC1.ASSET_ID AND TC2.tyre_id = TC1.TYRE_ID AND TC2.ROWNUMBER = TC1.ROWNUMBER + 1
/*
Create Tables
DROP TABLE [dbo].[assets_tyre_change_header]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[assets_tyre_change_header](
[id] [int] IDENTITY(1,1) NOT NULL,
[change_date] [date] NOT NULL,
[asset_id] [varchar](50) NOT NULL,
[odometer_hour] [varchar](50) NULL,
[completed] [tinyint] NULL,
[comment] [text] NULL,
CONSTRAINT [assets_tyre_change_pk] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
USE [Sandbox]
GO
DROP TABLE [dbo].[assets_tyre_change_details]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[assets_tyre_change_details](
[id] [int] IDENTITY(1,1) NOT NULL,
[tyre_change_id] [int] NULL,
[tyre_id] [varchar](50) NOT NULL,
[wheel_position] [varchar](50) NOT NULL,
[tread_depth] [int] NOT NULL,
[minimum_depth] [int] NOT NULL,
CONSTRAINT [assets_tyre_change_detail_pk] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
USE [Sandbox]
GO
DROP TABLE [dbo].[assets_tyre_inspection_header]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[assets_tyre_inspection_header](
[id] [int] IDENTITY(1,1) NOT NULL,
[inspection_date] [date] NOT NULL,
[asset_id] [varchar](50) NOT NULL,
[odometer_hour] [varchar](50) NULL,
[completed] [tinyint] NULL,
[comment] [text] NULL,
CONSTRAINT [assets_tyre_inspection_pk] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
USE [Sandbox]
GO
DROP TABLE [dbo].[assets_tyre_inspection_details]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[assets_tyre_inspection_details](
[id] [int] IDENTITY(1,1) NOT NULL,
[tyre_inspection_id] [int] NULL,
[tyre_id] [varchar](50) NOT NULL,
[wheel_position] [varchar](50) NOT NULL,
[tread_depth] [int] NOT NULL,
CONSTRAINT [assets_tyre_inspection_detail_pk] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
---------------
Populate Tables
---------------
insert into assets_tyre_change_header
( --id ,
change_date ,
asset_id ,
odometer_hour
--completed ,
--comment
)
values
(cast('2016/04/01' as smalldatetime),'TestV',1489),
(cast('2016/04/01' as smalldatetime),'TestV',1489),
(cast('2016/04/02' as smalldatetime),'Forklift001',6900),
(cast('2016/04/02' as smalldatetime),'Forklift001',6900),
(cast('2016/04/08' as smalldatetime),'TestV',2800),
(cast('2016/04/08' as smalldatetime),'TestV',2800),
(cast('2016/04/08' as smalldatetime),'TestV',2800),
(cast('2016/04/11' as smalldatetime),'Forklift001',6950),
(cast('2016/04/11' as smalldatetime),'Forklift001',6950)
insert into assets_tyre_change_details
( --id ,
tyre_change_id ,
tyre_id ,
wheel_position ,
tread_depth ,
minimum_depth
)
values
(1,'T001',4,15,5),
(2,'T002',6,15,5),
(3,'F146',3,30,5),
(4,'F147',2,30,5),
(5,'T001',6,12,5),
(6,'T002',4,10,5),
(7,'T003',12,15,5),
(8,'F148',1,1,5),
(9,'F149',4,4,5)
insert into assets_tyre_inspection_header
( --id ,
inspection_date ,
asset_id ,
odometer_hour
--completed ,
--comment
)
values
(cast('2016/04/09' as smalldatetime),'Forklift001',6920),
(cast('2016/04/09' as smalldatetime),'Forklift001',6920),
(cast('2016/04/10' as smalldatetime),'TestV',3400),
(cast('2016/04/10' as smalldatetime),'TestV',3400)
insert into assets_tyre_inspection_details
( --id ,
tyre_inspection_id ,
tyre_id ,
wheel_position ,
tread_depth --,
--tread_depth
)
values
(1,'F146',3,27),
(2,'F147',2,15),
(3,'T001',6,9),
(4,'T002',12,12)
*/