繁体   English   中英

将SQL行转换为具有多个分组数据的列

[英]Transposing SQL Row to column with multiple grouped data

我在oracle sql 12c中旋转/转置数据时遇到问题,

我有一个像这样的源表: 在此处输入图片说明

我的目的是像这样转置到目标表: 在此处输入图片说明

我怎样才能做到这一点? 我被困在选择要写入目标表的主机名类别的特定值。

请指教,

谢谢你,加利

我解决了问题并在SQL Server中执行查询。

创建表并插入示例数据:

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)

动态SQL PIVOT查询:

    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

结果:

在此处输入图片说明

这是一个可能适用于Oracle的关键逻辑。 为了避免出现问题,我从关键字更改了一些列名称。

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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