iT邦幫忙

0

只需要table b最後一筆的異動理由 要怎麼寫SQL

XYZ 2021-04-15 16:15:141051 瀏覽

同一個車號我只需要table b最後一筆的異動理由,若車號沒有異動理由則異動理由就是空的,我要的結果如圖四,請問SQL要怎麼寫?
抱歉更新需求,如下圖,請忽略討論的需求

https://ithelp.ithome.com.tw/upload/images/20210415/20108157taEp2wa1yY.jpg

https://ithelp.ithome.com.tw/upload/images/20210415/20108157Cx1SrnJWkv.jpg

https://ithelp.ithome.com.tw/upload/images/20210415/20108157rEJirZJLWO.jpg

https://ithelp.ithome.com.tw/upload/images/20210415/20108157FUO7QpTkBj.jpg

XYZ iT邦新手 5 級 ‧ 2021-04-15 16:18:10 檢舉
怎麼不能上傳圖片?

Table a 公司代號 車號
1 A
1 B
1 C
2 D
2 E
3 F
4 H
XYZ iT邦新手 5 級 ‧ 2021-04-15 16:18:33 檢舉
Table b 異動單號 車號 異動理由
1 A 轉換給1
2 A 轉換給2
3 A 轉換給3
4 A 退租
5 B 轉換給1
6 C 轉換給2
7 C 轉換給3
8 C 轉換給4
XYZ iT邦新手 5 級 ‧ 2021-04-15 16:18:59 檢舉
我要的結果

公司代號 車號 異動理由
1 A 退租
1 B 轉換給1
1 C 轉換給4
2 D
2 E
3 F
4 H
0
rogeryao
iT邦大師 1 級 ‧ 2021-04-15 17:01:55
最佳解答
CREATE TABLE A (
A1 NVARCHAR(10),  -- 公司代號
A2 NVARCHAR(10)); -- 車號

INSERT INTO A
VALUES
('1','A'),
('1','B'),
('1','C'),
('2','D'),
('2','E'),
('3','F'),
('4','H');
CREATE TABLE B (
B1 NVARCHAR(10),  -- 異動單號
B2 NVARCHAR(10)); -- 車號

INSERT INTO B
VALUES
('a1','A'),
('a2','A'),
('a3','A'),
('a4','A'),
('a5','B'),
('a6','C'),
('a7','C'),
('a8','C');
CREATE TABLE C (
C1 NVARCHAR(10),  -- 異動單號
C2 NVARCHAR(10)); -- 異動理由

INSERT INTO C
VALUES
('a1',N'轉換給1'),
('a2',N'轉換給2'),
('a3',N'轉換給3'),
('a4',N'退租'),
('a5',N'轉換給1'),
('a6',N'轉換給2'),
('a7',N'轉換給3'),
('a8',N'轉換給4');
SELECT A1 AS'公司代號',A2 AS '車號',C2 AS '異動理由'
FROM A
LEFT JOIN (
SELECT *,ROW_NUMBER() OVER (PARTITION BY B.B2 ORDER BY B1 DESC) AS ROWNUM
FROM B
) AS D ON D.B2=A.A2 AND D.ROWNUM=1
LEFT JOIN C ON C.C1=D.B1
ORDER BY CONVERT(INT,A1),A2

Demo

XYZ iT邦新手 5 級 ‧ 2021-04-15 17:42:31 檢舉

抱歉更新需求,請忽略討論的需求,請問SQL要怎麼寫?

rogeryao iT邦大師 1 級 ‧ 2021-04-15 18:55:25 檢舉

SQL 已更新

1
allenlwh
iT邦高手 1 級 ‧ 2021-04-15 16:25:53
select 公司代號,車號
    ,(select top 1 異動理由 from Table b where b.車號=a.車號 order by 異動單號
        desc) as 異動理由
    from Table a
XYZ iT邦新手 5 級 ‧ 2021-04-15 17:42:15 檢舉

抱歉更新需求,請忽略討論的需求,請問SQL要怎麼寫?

1
純真的人
iT邦大師 1 級 ‧ 2021-04-15 16:39:32

弄點不一樣的XD

declare @a table(
	公司代號 int
	,車號 nvarchar(10)
)
insert into @a
values('1','A')
,('1','B')
,('1','C')
,('1','D')
,('1','E')
,('1','F')
,('1','H')

declare @b table(
	異動單號 int
	,車號 nvarchar(10)
	,異動理由 nvarchar(20)
)
insert into @b
values('1','A','轉換給1')
,('2','A','轉換給2')
,('3','A','轉換給3')
,('4','A','退租')
,('5','B','轉換給1')
,('6','C','轉換給2')
,('7','C','轉換給3')
,('8','C','轉換給4')

select 公司代號
,車號
,異動理由
from (
	select 公司代號
	,a.車號
	,異動理由
	,Row_Number()over(PARTITION BY a.車號 order by 異動單號 desc) Sort
	from @a a
	left join @b b on a.車號 = b.車號
) k
where Sort = 1

https://ithelp.ithome.com.tw/upload/images/20210415/20061369oZtFNVFH3e.png

XYZ iT邦新手 5 級 ‧ 2021-04-15 17:42:22 檢舉

抱歉更新需求,請忽略討論的需求,請問SQL要怎麼寫?

恩~多了一個left join而已@@..

declare @a table(
	公司代號 int
	,車號 nvarchar(10)
)
insert into @a
values('1','A')
,('1','B')
,('1','C')
,('2','D')
,('2','E')
,('3','F')
,('4','H')

declare @b table(
	異動單號 nvarchar(20)
	,車號 nvarchar(10)
)
insert into @b
values('a1','A')
,('a2','A2')
,('a3','A3')
,('a4','A')
,('a5','B')
,('a6','C')
,('a7','C')
,('a8','C')

declare @ec table(
	異動單號 nvarchar(20)
	,異動理由 nvarchar(20)
)
insert into @ec
values('a1','轉換給1')
,('a2','轉換給2')
,('a3','轉換給3')
,('a4','退租')
,('a5','轉換給1')
,('a6','轉換給2')
,('a7','轉換給3')
,('a8','轉換給4')

select 公司代號
,車號
,異動理由
from (
	select 公司代號
	,a.車號
	,異動理由
	,Row_Number()over(PARTITION BY a.車號 order by b.異動單號 desc) Sort
	from @a a
	left join @b b on a.車號 = b.車號
	left join @ec c on b.異動單號 = c.異動單號
) k
where Sort = 1

https://ithelp.ithome.com.tw/upload/images/20210415/20061369YmxgxsFoam.png

我要發表回答

立即登入回答