Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak przejść do kolumny z różnymi wartościami w tym samym wierszu w sql?

Jeśli chodzi o poprzednie uwagi dotyczące projektu tabeli - w rzeczywistości w tabeli jest nadmiarowość; możesz przechowywać nazwę empname w innym stole, do którego byś dołączył do swojego stołu tutaj, aby tego uniknąć; każda nadmiarowość jest potencjalną sprzecznością. Jeśli jednak mamy projekt tabeli zoptymalizowany pod kątem wykonywania zapytań i minimalizowania niezbędnych złączeń, może on zostać wypełniony w zadaniu wsadowym z innego miejsca, a wtedy projekt byłby odpowiedni.

To, co chcesz tutaj zrobić, jest często określane jako „przechylanie w poziomie”. Brakuje nam tutaj pewnych informacji, więc zakładam maksymalną liczbę pożyczek 2. Potrzebujemy mechanizmu, który pozwoli nam umieścić dane w col1 lub col2, w zależności od tego, czy jest to pierwszy czy drugi rząd dla tego samego empno. Dlatego generujemy numer sekwencyjny. Na koniec używamy wyrażenia SUM(CASE seq WHEN ...) w połączeniu z GROUP BY, aby zmniejszyć liczbę wierszy i spłaszczyć tabelę.

Oto idzie:

-- 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
;

Miłej gry

Marco




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle PL/SQL:blokowanie wykonywania równoległego

  2. Identyfikator jest za długi w Oracle

  3. PL/SQL - wykonanie natychmiastowe w funkcji potokowej

  4. NetBeans IDE pod Oracle

  5. Jak ręcznie ustawić ciąg połączenia Oracle w DbContext?