SQL превращение строк в столбцы и заполнение значениями - PullRequest
1 голос
/ 13 марта 2020

Я не совсем уверен, почему эта таблица была разработана таким образом, но это затрудняет решение моей проблемы. Глядя на данные:

NAME            TYPE_NAME               DEFAULT_VALUE           VALUE
TEST 1          Currency                Null                    14
TEST 1          Event Count             0                       0
TEST 1          Usage                   8                       Null
TEST 1          Events Amt              0                       0
TEST 1          Usage Amt               Null                    13
TEST 1          From Date               Null                    5
TEST 1          To Date                 6                       Null
TEST 1          Traffic Scenario        Null                    2
TEST 1          Band                    1                       Null
TEST 1          Service                 15                      Null
TEST 1          Tariff Rate Name        Null                    4
TEST 2          Currency                EUR                     0
TEST 2          Event Count             Null                    9
TEST 2          Usage                   10                      Null
TEST 2          Events Amt              Null                    13
TEST 2          Usage Amt               Null                    14
TEST 2          From Date               Null                    3
TEST 2          To Date                 4                       Null
TEST 2          Traffic Scenario        Null                    5
TEST 2          Band                    6                       Null
TEST 2          Service                 7                       Null
TEST 2          Tariff Rate Name        Null                    8
TEST 3          Currency                USD                     0
TEST 3          Event Count             0                       0
TEST 3          Usage                   4                       Null
TEST 3          Events Amt              0                       0
TEST 3          Usage Amt               Null                    5
TEST 3          From Date               Null                    1
TEST 3          To Date                 2                       Null
TEST 3          Traffic Scenario        13603                   0
TEST 3          Band                    3                       Null
TEST 3          Service                 3                       Null
TEST 3          Tariff Rate Name        24HR                    0

Мне нужна помощь в следующем: выполните для каждого имени столбец type_name, а затем заполните эти столбцы значением по умолчанию или значением.

Вот так:

NAME    Currency        Event Count     Usage   Events Amt      Usage Amt       From Date       To Date Traffic Scenario        Band    Service Tariff Rate Name
TEST 1  14              0               8       0               13              5               6       2                       1       15      4
TEST 2  EUR             9               10      13              14              3               4       5                       6       7       8
TEST 3  USD             0               4       0               5               1               2       13603                   3       3       24HR

В основном заполняется из default_value или значения, в зависимости от того, какое из них не равно нулю, если оба равны нулю, то просто 0.

Может ли кто-нибудь помочь мне с этим, как мой SQL здесь не хватает знаний.

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 13 марта 2020

Вы можете попробовать это. Я пробовал oracle.

Также этот метод COALESCE (DEFAULT_VALUE, VALUE) должен управлять первым DEFAULT_VALUE и вторым VALUE .

SELECT t1.NAME,
max(CASE WHEN t1.TYPE_NAME ='Currency'      THEN COALESCE (t1.DEFAULT_VALUE, T1.VALUE) END) AS Currency,
max(CASE WHEN t1.TYPE_NAME ='Event Count'   THEN COALESCE (t1.DEFAULT_VALUE, T1.VALUE) END) AS Event_Count
max(CASE WHEN t1.TYPE_NAME ='Usage'         THEN COALESCE (t1.DEFAULT_VALUE, T1.VALUE) END) AS Usage,
max(CASE WHEN t1.TYPE_NAME ='Usage Amt'     THEN COALESCE (t1.DEFAULT_VALUE, T1.VALUE) END) AS Usage_Amt,
max(CASE WHEN t1.TYPE_NAME ='From Date'     THEN COALESCE (t1.DEFAULT_VALUE, T1.VALUE) END) AS From_Date,
max(CASE WHEN t1.TYPE_NAME ='Band'          THEN COALESCE (t1.DEFAULT_VALUE, T1.VALUE) END) AS Band,
.......
......
FROM MYTABLE t1 GROUP BY t1.NAME
1 голос
/ 13 марта 2020

Вы можете выполнить условное агрегирование:

select 
    name,
    max(case when type_name = 'Currency'
        then coalesce(value, default_value)
    end) currency,
    max(case when type_name = 'Event Count' 
        then coalesce(value, default_value) 
    end) event_count,
    max(case when type_name = 'Usage'
        then coalesce(value, default_value)
    end ) usage,
    max(case when type_name = 'Events Amt'
        then coalesce(value, default_value)
    end) events_amt
from mytable
group by name

Условные выражения фактически приводят к результату; coalesce() возвращает либо value, если это не null, либо default_value.

1 голос
/ 13 марта 2020

Вы можете использовать PIVOT следующим образом:

SELECT * FROM
( SELECT NAME, TYPE_NAME, COALESCE(VALUE, DEFAULT_VALUE) AS VAL
    FROM YOUR_TABLE
) 
PIVOT 
( MAX ( VAL )
  FOR TYPE_NAME IN ( 'Currency' AS CURRENCY, 'Event Count' AS EVENT_COUNT, 
                       'Usage' AS USAGE_, 'Events Amt' AS EVENTS_AMT )
)

Ура !!

1 голос
/ 13 марта 2020

Это таблица EAV (entity-attribute-value). Если вы знаете нужные столбцы, вы можете использовать условное агрегирование:

select name,
       max(case when type_name = 'Currency' then default_value end) as currency,
       max(case when type_name = 'Event Count ' then default_value end) as EventCount,
       . . . 
from t
group by name;

Если вы не знаете все типы, то вам нужны Dynami c SQL - то есть PL / SQL в Oracle.

...