2016-04-11 9 views
0

おはようございます。以前の結果に基づいてSql Setの次の関連レコードを取得する

私はタイヤの変更と車両の点検に基づいて報告を求められました。

投稿の下部にさまざまな部分を貼り付けています。

しかし、私は基本的にそれが置かれた、別のタイヤがその場所など

を取ったときにタイヤが資産との間の差の特定の位置にあったどのくらいの時間を見つけるされなければならないものを私が全くありません私が一般的なSQL Serverを初めて使用しているときに、このクエリをどこから始めるのかを考えてください。 SQLで

私のテーブルは

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 

答えて

0
/* 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) 


*/ 
+0

ありがとうございます。検査表を挿入するように編集しようとしています。しかし、これまでのところ有望に見えます。結果をお知らせします –

関連する問題