i'm having problem pivoting/transposing data in oracle sql 12c,
i have a source table like this:
my purpose is to transpose to target table like this:
how can i achieve this? i'm stuck in picking specific value of category of a hostname to write in target table..
please advice,
thank you, galih
I solved the problem and execute the query in SQL Server.
Create the table and insert sample data:
CREATE TABLE [dbo].[tmpTbl](
[date] [datetime] NULL,
[time] [datetime] NULL,
[hostname] [nvarchar](30) NULL,
[type] [nvarchar](30) NULL,
[category] [nvarchar](30) NULL,
[target] [nvarchar](30) NULL,
[value] [decimal](18, 2) NULL
)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate1', 'FIREWALL', 'DISCARD', 'gate1', 0.02)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate1', 'FIREWALL', 'ERROR', 'gate1', 0)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate1', 'FIREWALL', 'REACHABILITY', 'gate1', 100)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate1', 'FIREWALL', 'THROUGHTPUT', 'gate1', 172527000)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate2', 'FIREWALL', 'DISCARD', 'gate2', 0)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate2', 'FIREWALL', 'ERROR', 'gate2', 0)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate2', 'FIREWALL', 'REACHABILITY', 'gate2', 100)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'gate2', 'FIREWALL', 'THROUGHTPUT', 'gate2', 121986000)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail1', 'LOAD BALANCER', 'CONNECTION', 'webmail1', 10395)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail1', 'LOAD BALANCER', 'CPU_utilization', 'webmail1', 28)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail1', 'LOAD BALANCER', 'DISCARD', 'webmail1', 1.2)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail1', 'LOAD BALANCER', 'ERROR', 'webmail1', 0)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail1', 'LOAD BALANCER', 'REACHABILITY', 'webmail1', 100)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail2', 'LOAD BALANCER', 'Status', 'webmail2', 100)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail2', 'LOAD BALANCER', 'THROUGHTPUT', 'webmail2', 56680700)
insert into tmpTbl values ('01 Oct 2017', '0:00:00', 'webmail2', 'LOAD BALANCER', 'CONNECTION', 'webmail2', 0)
Dinamic SQL PIVOT Query:
DECLARE @cols AS NVARCHAR(MAX),
@SQL AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category)
FROM tmpTbl c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @SQL = 'SELECT Year([date]) AS [YEAR], Month([date]) AS [MONTH], CONVERT(VARCHAR(10), [date], 103) AS DATEX,
DATEPART(HOUR, [date]) AS [HOURX], [type] AS DEVICE_TYPE, [hostname] AS DEVICE_NAME, ' + @cols + ' from
(
select [date]
, [type]
, [hostname]
, value
, category
from tmpTbl
) T
PIVOT
(
MAX(value)
for category in (' + @cols + ')
) pv '
Execute(@SQL)
drop table tmpTbl
Results:
Here is a pivot logic that might work with Oracle. I have changed some column names from keywords to avoid issues.
SELECT EXTRACT(YEAR FROM DATEX) YEAR,
EXTRACT(MONTH FROM DATEX) MONTH,
DATEX,
TIMEX,
TYPE DEVICE_TYPE,
HOSTNAME DEVICE_NAME,
SUM(CASE WHEN category = 'MEMORY' THEN valued ELSE NULL END) MEMORY,
SUM(CASE WHEN category = 'DISCARD' THEN valued ELSE NULL END) DISCARDED,
SUM(CASE WHEN category = 'ERROR' THEN valued ELSE NULL END) ERROR,
SUM(CASE WHEN category = 'REACHBILITY' THEN valued ELSE NULL END) REACHBILITY,
SUM(CASE WHEN category = 'STATUS' THEN valued ELSE NULL END) STATUSES,
SUM(CASE WHEN category = 'THROUGHPUT' THEN valued ELSE NULL END) THROUGHPUT,
SUM(CASE WHEN category = 'CONNECTION' THEN valued ELSE NULL END) CONNECTIONS
FROM tmpTbl
GROUP BY DATEX, TIMEX, TYPE, HOSTNAME
Hope this helps.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.