Hỏi Đáp SQL------------ Không có câu hỏi nào là sơ đẳng --------

Đặt câu hỏi và trả lời cho PL/SQL 1

Đâ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]

15 nhận xét:

  1. chào bác, em muốn hỏi bác vấn đề này.
    dữ 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

    Trả lờiXóa
    Trả lời
    1. [code]
      ;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]

      Xóa
  2. Nhận xét này đã bị tác giả xóa.

    Trả lờiXóa
  3. THÁ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

    NGÀ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

    Trả lờiXóa
  4. 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óa
  5. như trên mình cần KQ: ngày 4/2,5/2/-8/2 = ngày 3/2 =15

    Trả lờiXóa
  6. Ban chay thu cai nay xem sao

    [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]

    Trả lờiXóa
  7. 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óa
  8. Khô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óa
  9. Nhu 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.

    Duoi 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]

    Trả lờiXóa
  10. Trả lời
    1. Khong co gi, day la cong viec va niem vui cua toi. Chuc ban vui ve

      Xóa
  11. Cho 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óa
  12. giải giúp em câu này với ạ

    hãy lấy ra 10 bài viết mới hơn bài viết đang xem

    Trả lờiXóa
  13. Cho mình hỏi hàm này nó sẽ chạy như thế nào ?
    INSTR('','' || :p_IsInfRT || '','','','' || rm.IsInf || '','')

    Trả lờiXóa