SQL将行变成列并填充值

问题描述 投票:1回答:3

我不太确定为什么要用这种方式设计这张桌子,但是这很难解决我的问题。查看数据:

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作为一列,然后使用default_value或value填充这些列。

喜欢这个:

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或value填充,取决于哪一个不为null,如果都为零,则仅为0。

有人可以帮助我,因为这里缺少我的SQL知识。

非常感谢!

sql oracle group-by pivot
3个回答
1
投票

这是一个EAV(实体属性值)表。如果知道所需的列,则可以使用条件聚合:

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;

如果您不知道所有类型,那么您需要动态SQL-即Oracle中的PL / SQL。


1
投票

您可以进行条件聚合:

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


0
投票

您可以如下使用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 )
)

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.