简体   繁体   中英

Transposing SQL Row to column with multiple grouped data

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM