如果我有 2 張桌子:
成員:
CREATE TABLE members
(member_id number,
lastname varchar2(10),
firstname varchar2(10),
license# number(9),
ST char(2),
credit_card number(12));
INSERT INTO members VALUES(10, 'Tangier', 'Tim', 111111111, 'VA', 123456789111);
INSERT INTO members VALUES(12, 'Maulder', 'Fox', 333333333, 'FL', 333333333333);
INSERT INTO members VALUES(13, 'Wild', 'Coyote', 444444444, 'VA', 444444444444);
INSERT INTO members VALUES(14, 'Joan', 'Casteel', 555555555, 'FL', 555555555555);
和出租:
CREATE TABLE rental
(rental_id number(2),
rent_date date,
return_date date,
pay_method varchar2(10),
movie_id number,
member_id number);
INSERT INTO rental VALUES(1, '18-SEP-09', '1-OCT-09', 'Credit', 11, 10);
INSERT INTO rental VALUES(2, '18-SEP-09', '3-OCT-09', 'Credit', 8, 10);
INSERT INTO rental VALUES(3, '11-OCT-09', '19-OCT-09', 'Check', 6, 12);
INSERT INTO rental VALUES(4, '28-OCT-09', '31-OCT-09', 'Debit', 3, 13);
INSERT INTO rental VALUES(5, '28-OCT-09', '5-NOV-09', 'Debit', 5, 13);
INSERT INTO rental VALUES(6, '29-OCT-09', '11-NOV-09', 'Debit', 11, 13);
INSERT INTO rental VALUES(7, '1-NOV-09', '11-NOV-09', 'Credit', 10, 14);
INSERT INTO rental VALUES(8, '2-NOV-09', '10-NOV-09', 'Credit', 12, 14);
INSERT INTO rental VALUES(9, '5-NOV-09', NULL, 'Cash', 4, 12);
INSERT INTO rental VALUES(10, '8-NOV-09', '18-NOV-09', 'Cash', 12, 12);
INSERT INTO rental VALUES(11, '14-NOV-09', NULL, 'Cash', 3, 12);
INSERT INTO rental VALUES(12, '18-NOV-09', NULL, 'Debit', 11, 13);
如何顯示租賃日期和歸還日期之間的周數?如果為 NULL,則回傳日期在名為“delay_weeks”的新列中設定為“2009 年 12 月 1 日”,該列應四舍五入為整數。然后還有一個名為“狀態”的新列,它顯示每個事務是否已回傳。
這是一個家庭作業問題,但我似乎無法正確回答。我們應該只使用 1 個 SQL 陳述句。
到目前為止,我已經嘗試了以下方法,我認為這幾乎是正確的,但是我得到了錯誤:“MEM”.“RENTAL_ID”:無效識別符號。
SELECT mem.member_id AS member_id,
ren.rental_id AS rental_transaction_id,
case
when ren.return_date IS NULL
THEN ROUND(TO_DATE('01-dec-2009','dd-mm-yyyy')-TO_DATE(ren.rent_date, 'dd-mm-yyyy'))
ELSE ROUND(TO_DATE(ren.return_date, 'dd-mm-yyyy')-TO_DATE(ren.rent_date, 'dd-mm-yyyy'))
END AS delay_weeks,
CASE
WHEN ren.return_date IS NULL
THEN 'not return'
ELSE 'return'
END AS status
FROM members mem
JOIN rental ren ON mem.member_id = ren.member_id
order BY member_id;
對此的任何指導將不勝感激。如果需要澄清,請告訴我。TIA。
uj5u.com熱心網友回復:
您可以減去日期,提供一個'Dec 1, 2009'日期代替NULL return_dates,然后除以 7:
select m.member_id, r.rental_id, floor(((case when r.return_date is null then to_date('01-DEC-09') else r.return_date end) - r.rent_date)/7) weeks
from rental r join members m on r.member_id = m.member_id;
uj5u.com熱心網友回復:
不要呼叫TO_DATE已經是日期的值;如果你解決了這個問題,那么你就會得到代碼:
case
when ren.return_date IS NULL
THEN ROUND(TO_DATE('01-dec-09','dd-mm-yyyy')-ren.rent_date)
ELSE ROUND(ren.return_date-ren.rent_date)
END AS delay_weeks,
如果您運行它,那么它會突出顯示TO_DATE('01-dec-09','dd-mm-yyyy')預計 4 位數年份的下一個問題,但您只提供了 2 位數年份,因此您將獲得公元 9 年而不是公元 2009 年(以及大約-730461天數的差異)。最好的解決方案是使用日期文字(而不是嘗試從字串轉換):
case
when ren.return_date IS NULL
THEN ROUND(DATE '2009-12-01'-ren.rent_date)
ELSE ROUND(ren.return_date-ren.rent_date)
END AS delay_weeks,
然后你可以使用COALESCE函式而不是CASE運算式來簡化它:
ROUND(COALESCE(ren.return_date, DATE '2009-12-01') - ren.rent_date)
AS delay_weeks,
然后,當您減去兩個日期時,您會得到天數(而不是周數)的差異,因此您需要除以 7:
SELECT mem.member_id AS member_id,
ren.rental_id AS rental_transaction_id,
ROUND((COALESCE(ren.return_date, DATE '2009-12-01') - ren.rent_date)/7)
AS delay_weeks,
CASE
WHEN ren.return_date IS NULL
THEN 'not return'
ELSE 'return'
END AS status
FROM members mem
JOIN rental ren ON mem.member_id = ren.member_id
order BY member_id;
如果您只想計算整周,那么您想使用FLOOR. 如果你想計算部分周,那么你想使用CEIL,如果你想計算到最近的一周,那么使用ROUND. 我假設你想要一個FLOOR或CEIL而不是,ROUND但問題并不清楚該要求。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369920.html
下一篇:如何撰寫查詢來執行此操作?
