我不太确定为什么要用这种方式设计这张桌子,但是这很难解决我的问题。查看数据:
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知识。
非常感谢!
这是一个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。
您可以进行条件聚合:
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
。
您可以如下使用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 )
)
干杯!