Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да отидем за колона с различни стойности в един и същ ред в sql?

Относно предишните коментари относно дизайна на таблицата - всъщност в таблицата има излишък; можете да съхраните empname в друга таблица, която бихте съединили с вашата таблица тук, за да избегнете това; всяко излишък е потенциално противоречие. Въпреки това, ако имаме дизайн на таблица, оптимизиран за заявки и минимизиране на необходимите съединения, той може да бъде попълнен в пакетна работа от някъде другаде и тогава дизайнът ще бъде подходящ.

Това, което искате да направите тук, често се нарича „хоризонтално завъртане“. Тук ни липсва известна информация, така че приемам максимален брой заеми от 2. Нуждаем се от механизъм, който ни позволява да поставяме данни в col1 или col2, в зависимост от това дали е първи или втори ред за едно и също empno. Ето защо генерираме пореден номер. Накрая използваме израз SUM(CASE seq WHEN ...) във връзка с GROUP BY, за да намалим броя на редовете и да изравним таблицата.

Ето го:

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

Приятна игра

Марко




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Гръцкият текст не се показва правилно

  2. Относно елемента формат V в Oracle

  3. Функция COS() в Oracle

  4. Как да идентифицираме невалидни (повредени) стойности, съхранени в колони DATE на Oracle

  5. Автоматично увеличаване в оракул към вече създадена таблица