2017-01-09 1 views
-2

моя таблица имеет следующий strucutureКак перейти к столбцу с разными значениями в одной строке в sql?

 
empno empname loan ref amount 
1  abc  123  100 
1  abc  456  200. 

т.е. работника могли воспользоваться два кредита (скажем, автомобиль и скутер).

Выход ожидается:

 
empno empname  loan ref1 amt loanref2 amt 
1  abc   120  100 456   200 

, чтобы избежать дублирования EMPNO повторения. Как это сделать в sql ???

+3

Сколько дублируется строк вы можете иметь для каждого EMPNO? Если это переменная, вам нужен запрос с переменным числом столбцов, что невозможно. Кроме того, вы что-то пробовали? Пожалуйста, разместите свои попытки и проблемы, которые у вас есть. – Aleksej

+3

Для начала: это ужасный дизайн стола. Что, если вы найдете empno 1 в одной записи с именем «abc», а в другом - с именем «efg»? Затем, сколько записей у вас может быть для одного сотрудника? Сколько столбцов вы хотите получить? –

+0

Кроме того, ПОЧЕМУ вы хотите избежать «дубликатов» в таблице? Что не так с дубликатами? Они абсолютно правильны, нормальны и стандартизированы в подобной ситуации. У вас нет реальных проблем, которые нужно решить? – mathguy

ответ

1

Относительно предыдущих комментариев по дизайну таблиц - на самом деле существует избыточность в таблице; вы можете сохранить 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 
; 

Happy играть

Marco

Смежные вопросы