2014-09-09 3 views
1

Я пытаюсь построить запрос SQL на качестве oracle database:Получить для конкретных тегов значения в столбце

Я получаю с двумя запросами следующие наборы результатов.

Результат Набор 1:

Таблица Теги:

SELECT ProjID, Tag_Code, Value_numeric, Value_String from Tags; 
+-------------------------------------------------------------------------+ 
| ProjID    Tag_Code    Value_numeric  Value_String | 
+-------------------------------------------------------------------------+ 
| 1    TOT_CUST_EXPOSURE    100    null  | 
| 1    EXPOSURE_DATE     null    1.1.2014 | 
| 1    DEBT       100    null  | 
| 2    TOT_CUST_EXPOSURE    232    null  | 
| 2    EXPOSURE_DATE     null    12.05.2013 | 
| 2    DEBT       2324    null  | 
| 3    TOT_CUST_EXPOSURE    3452    null  | 
| 3    EXPOSURE_DATE     null    19.03.2014 | 
| 3    DEBT       2345    null  | 
| 4    TOT_CUST_EXPOSURE    3245674   null  | 
| 4    EXPOSURE_DATE     null    19.03.2014 | 
| 4    DEBT       12345   null  | 
+-------------------------------------------------------------------------+ 

Результат Набор 2:

Таблица: Проект

SELECT ProjID, CustomerName from Project; 
+--------------------------------------+ 
| ProjID  CustomerName    | 
+--------------------------------------+ 
| 1    a      | 
| 2    b      | 
| 3    c      | 
| 4    d      | 
+--------------------------------------+ 

Однако я хотел бы получить этот набор результатов.

+--------------------------------------------------------------------------+ 
| ProjID  CustomerName TOT_CUST_EXPOSURE EXPOSURE_DATE DEBT   | 
+--------------------------------------------------------------------------+ 
| 1    a    100    1.1.2014  100   | 
| 2    b    232    12.05.2013 2324  | 
| 3    c    3452    19.03.2014 2345  | 
| 4    d    3245674   19.03.2014 12345  | 
+--------------------------------------------------------------------------+ 

Возможно ли это в sql? Как я могу это реализовать? Я очень ценю ваш ответ!

ответ

1

Базовый путь, совместимый с текущей таблицей (fiddle):

select 
    p.ProjID ProjID, 
    p.CustomerName CustomerName, 
    (select Value_Numeric from tags 
    where ProjID=p.ProjID 
     and Tag_Code='TOT_CUST_EXPOSURE') TOT_CUST_EXPOSURE, 
    (select Value_String from tags 
    where ProjID=p.ProjID 
     and Tag_Code='EXPOSURE_DATE') EXPOSURE_DATE, 
    (select Value_Numeric from tags 
    where ProjID=p.ProjID 
     and Tag_Code='DEBT') DEBT 
    from Project p; 

Другой способ, в котором Tag_Code значения сохраняются в одном столбце Value. При том, что мы можем легко использовать pivot (fiddle):

select 
    p.ProjID ProjID, 
    p.CustomerName CustomerName, 
    TOT_CUST_EXPOSURE, 
    EXPOSURE_DATE, 
    DEBT from 
    Project p left join 
    (select * from 
    (select ProjID, Tag_Code, Value from tags) 
    pivot 
    (max(Value) for (Tag_Code) in (
     'TOT_CUST_EXPOSURE' as TOT_CUST_EXPOSURE, 
     'EXPOSURE_DATE' as EXPOSURE_DATE, 
     'DEBT' as DEBT 
    )) 
) t 
    on p.ProjID=t.ProjID; 

Использование выше pivot метода вернет null к полям, если есть запись в таблице Project без соответствующих записей в таблице Tags.

+0

Thx для вашего ответа! Что мне делать, если для одного «проекта», скажем, с «project id = 8», в «теге» нет записи. Как справиться с этим, не получив ошибку? – mrquad

+0

Для ответа 'pivot': измените' inner join' на 'left join', а затем остальные поля будут заполнены значениями' null'. ([Скрипка] (http://sqlfiddle.com/#!4/6ade6/2/0)). ** EDIT: ** обновленная вторая часть ответа – yamny

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