Đây là nơi các bạn có thể đặt tất cả các câu hỏi liên quan đến PL/SQL. Không có câu hỏi nào là quá dễ, tất cả đều được hoan nghênh. Với những câu hỏi liên quan đến các đoạn mã bạn gởi lên, xin gởi đoạn mã trong thẻ [code] và [/code].
Ví dụ :
[code]
select * from bang1
[/code]
Hỏi Đáp SQL------------ Không có câu hỏi nào là sơ đẳng -------- |
chào bác, em muốn hỏi bác vấn đề này.
Trả lờiXóadữ liệu của em có từ ngày 01-đến ngày 31, tuy nhiên 1 trong số các ngày ko có dữ liệu, em muốn lấy ngày trước có dữ liệu = ngày không có dữ liệu thì trong câu PL/SQL phải làm thế nào:
vd: Ngay01: 1.000.000
Ngay02:3.000.000
Ngay03:2.000.000
Ngay04:
Ngay05: 4.000.000
em muốn ngày 04= giá trị của ngày 03=2.000.000
[code]
Xóa;WITH cte AS(
SELECT ngay, giatri, giatriNgayTruoc = Lag(giatri) OVER(ORDER BY ngay)
FROM @bangCuaBan
)
SELECT ngay, CASE WHEN giatri IS NULL OR giatri='' THEN giaTriNgayTruoc ELSE giatri END AS giatri
FROM cte
[/code]
Day la toan bo ma cho ban chay thu
[code]
DECLARE @bangCuaBan TABLE(ngay DATE, giatri MONEY)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/01/2015',1)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/02/2015',3)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/03/2015',2)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/04/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/05/2015',4)
SELECT * FROM @bangCuaBan
;WITH cte AS(
SELECT ngay, giatri, giatriNgayTruoc = Lag(giatri) OVER(ORDER BY ngay)
FROM @bangCuaBan
)
SELECT ngay, CASE WHEN giatri IS NULL OR giatri='' THEN giaTriNgayTruoc ELSE giatri END AS giatri
FROM cte
------ ket qua truy xuat
ngay giatri
2015-11-01 1.00
2015-11-02 3.00
2015-11-03 2.00
2015-11-04 NULL
2015-11-05 4.00
ngay giatri
2015-11-01 1.00
2015-11-02 3.00
2015-11-03 2.00
2015-11-04 2.00
2015-11-05 4.00
[/code]
Nhận xét này đã bị tác giả xóa.
Trả lờiXóaTHÁNG 02 EM CÓ 8 NGÀY BỊ NULL, NHƯNG KHI BÙ ĐẮP 8 NGÀY THÌ NÓ LẠI NHẢY SỐ KHÔNG ĐÚNG VỚI SỐ DƯ CUỐI CÙNG CỦA NGÀY NOT NULL, VÀ E MUỐN KÉO SỐ DƯ CUỐI CỦA THÁNG TRƯỚC SANG ĐẦU THÁNG SAU TRONG TRƯỜNG HỢP NULL 2 -3 NGÀY ĐẦU TIỀN CỦA THÁNG
Trả lờiXóaNGÀY 1/2 : 10
NGÀY 2/2: 15
NGÀY 3/2: 15
NGÀY 4/2: NULL
NGÀY 5/2: NULL
NGÀY 6/2: NULL
NGÀY 7/2: NULL
NGÀY 8/2: NULL
NGÀY 9/2: 40
....
NGÀY 29/2: 10
Ban cho vi du cu the duoc khong, voi du lieu nhu tren cua ban, ban muon ket qua truy xuat the nao ?
Trả lờiXóanhư trên mình cần KQ: ngày 4/2,5/2/-8/2 = ngày 3/2 =15
Trả lờiXóaBan chay thu cai nay xem sao
Trả lờiXóa[code]
DECLARE @bangCuaBan TABLE(ngay DATE, giatri MONEY)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/01/2015',1)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/02/2015',3)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/03/2015',2)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/04/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/05/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/06/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/07/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/08/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/09/2015',4)
SELECT * FROM @bangCuaBan
SELECT
ngay,
giatri =
iif(b1.giatri is not null, b1.giatri,
(
select top 1 giatri from @bangCuaBan b2
where b2.giatri is not null and b2.ngay <b1.ngay order by b2.ngay desc
)
)
FROM @bangCuaBan b1
[/code]
không sài được LAG như trên à bác, bác có FB ko? cho em xin để tiện hỏi với đc ko?
Trả lờiXóaKhông, vì yêu cầu đã khác. LAG dùng để lấy dòng trước đó. Còn yêu cầu mới của bạn là lấy dòng NOT NULL trước đó. Nếu cố ý dùng LAG cũng được nhưng hiệu quả sẽ không cao và câu lênh trở nên phức tạp không cần thiết.
Trả lờiXóaNhu da de cap, neu muon su dung LAG trong yeu cau nay, ban phai tao them thong so phu, dan den cau lenh se ton kem hon khi truy xuat, va kho hieu hon. Tuy nhien neu ban van muon dung LAG thi day la cau lenh chho ban tham khao.
Trả lờiXóaDuoi day la 2 cau lenh truy xuat, cau thu nhat dung subquery, cau thu hai dung LAG, ca hai deu cho ket qua nhu nhau,
[code]
DECLARE @bangCuaBan TABLE(ngay DATE, giatri MONEY)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/01/2015',1)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/02/2015',3)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/03/2015',2)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/04/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/05/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/06/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/07/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/08/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/09/2015',4)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/10/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/11/2015',null)
INSERT INTO @bangCuaBan( ngay, giatri ) VALUES('11/12/2015',9)
SELECT * FROM @bangCuaBan
--- giai phap voi subqurey
SELECT
ngay,
giatri =
iif(b1.giatri is not null, b1.giatri,
(
select top 1 giatri from @bangCuaBan b2
where b2.giatri is not null and b2.ngay <b1.ngay order by b2.ngay desc
)
)
FROM @bangCuaBan b1
--- giai phap voi LAG
;WITH cte AS(
SELECT
*
, r = ROW_NUMBER() OVER(PARTITION BY giatri ORDER BY ngay)
, rn = ROW_NUMBER() OVER(ORDER BY ngay)
, l = Lag(giatri) OVER(ORDER BY ngay)
FROM @bangCuaBan b1
)
SELECT
ngay,
giatri = IIF(giatri IS NOT NULL, giatri, MAX(l) OVER(PARTITION BY rn-r ORDER BY ngay) )
FROM cte
ORDER BY ngay
[/code]
thank bạn nhiều :D
Trả lờiXóaKhong co gi, day la cong viec va niem vui cua toi. Chuc ban vui ve
XóaCho em hỏi mô hình quan hệ erd của phiếu xét tuyển làm như thế nào vậy
Trả lờiXóagiải giúp em câu này với ạ
Trả lờiXóahãy lấy ra 10 bài viết mới hơn bài viết đang xem
Cho mình hỏi hàm này nó sẽ chạy như thế nào ?
Trả lờiXóaINSTR('','' || :p_IsInfRT || '','','','' || rm.IsInf || '','')