Liên quan đến các ý kiến trước đây về thiết kế bảng - trên thực tế, có một sự dư thừa trong bảng; bạn có thể lưu trữ tên trống trong một bảng khác, mà bạn sẽ kết hợp với bảng của mình ở đây để tránh điều đó; mọi sự dư thừa đều tiềm ẩn mâu thuẫn.Tuy nhiên, nếu chúng ta có một thiết kế bảng được tối ưu hóa cho việc truy vấn và giảm thiểu các phép nối cần thiết, nó có thể được điền vào một công việc hàng loạt từ một nơi khác và khi đó thiết kế sẽ phù hợp.
Những gì bạn muốn làm ở đây thường được gọi là 'xoay vòng theo chiều ngang'. tùy thuộc vào việc đó là hàng đầu tiên hay hàng thứ hai cho cùng một empno. Đó là lý do tại sao chúng tôi tạo ra một số thứ tự. Cuối cùng, chúng tôi sử dụng biểu thức SUM (CASE seq WHEN ...) kết hợp với GROUP BY để giảm số hàng và làm phẳng bảng.
Đây là:
-- first global table expression - the input table
-- The table could exist already, and then this would not be needed.
WITH foo(empno,empname,loanref,amount) AS (
SELECT 1,'abc',123,100
UNION ALL SELECT 1,'abc',456,200
)
-- second global table expression - add sequence number
-- this needs to be in the query
, foo_numbered AS (
SELECT
-- need a number: 1 for the first, 2 for the second loan
ROW_NUMBER() OVER(PARTITION BY empname ORDER BY loanref) AS seq
, *
FROM foo
)
SELECT
empno
, empname
, MAX(CASE seq WHEN 1 THEN loanref END) AS loanref_1
, SUM(CASE seq WHEN 1 THEN amount END) AS amount_1
, MAX(CASE seq WHEN 2 THEN loanref END) AS loanref_2
, SUM(CASE seq WHEN 2 THEN amount END) AS amount_2
FROM foo_numbered
GROUP BY
empno
, empname
;
Chúc bạn chơi vui vẻ
Marco