sql—如何转换表并将结果分组?

m1m5dgzv  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(311)

我有一张这样的table:

  1. datetime datacenter machines
  2. ---------------------------------------------------------
  3. 2020-05-13 12:00:00.000 DC01 500
  4. 2020-05-13 12:00:00.000 DC02 100
  5. 2020-04-10 13:00:00.000 DC01 510
  6. 2020-04-10 13:00:00.000 DC02 120
  7. 2020-03-1 14:00:00.000 DC01 530
  8. 2020-03-1 14:00:00.000 DC02 140

datetime列是一个 Datetime2 类型,其余为 VARCHAR . 我需要创建一个新视图,该视图将按日期时间对条目进行分组,并从具有 dc01 以及 dc02 数据中心,并将机器的数量放在相应的行中,基本上是交换和合并数据。
在源表中,每个datetime总是有2个条目,每个数据中心有一个条目,合并后datetime应该是唯一的。下面是对结果的说明 view : resulting_view ```
datetime dc01_machines dc02_machines

2020-05-13 12:00:00.000 500 100
2020-04-10 13:00:00.000 510 120
2020-03-1 14:00:00.000 530 140

  1. 我花了一段时间试图想出解决办法。在我看来,我有一个解决方案,那就是做2个单独的选择,每个数据中心一个,用union组合它们,然后只按datetime对它们进行分组,但我确信这很糟糕,它甚至没有运行,这是一个错误 `invalid syntax near GROUP` . 尝试如下:

(SELECT t1.datetime
,t1.machines as dc01_machines
,'' as dc02_machines
FROM table1 t1
WHERE datacenter = 'DC01')
UNION
(SELECT t1.datetime
,'' as dc01_machines
,t1.machines as dc02_machines
FROM table1 t1
WHERE datacenter = 'DC02')
GROUP BY datetime

  1. 谢谢,谢谢你的帮助!
vyswwuz2

vyswwuz21#

我建议使用条件聚合。
与特定供应商不同 pivot 在语法上,这是一种可移植的方法(即在大多数数据库上都可以使用),它的性能通常至少与特定于供应商的实现一样好,甚至更好。
它也更灵活-这对您的特定用例没有影响,但在更复杂的情况下,也就是说 pivot 无法容纳(例如:列出dc01中id为510或更大的机器,以及dc02中id为120或更少的机器)。

  1. select
  2. datetime,
  3. max(case when datacenter = 'DC01' then machines end) dc01_machines,
  4. max(case when datacenter = 'DC02' then machines end) dc02_machines
  5. from mytable
  6. group by datetime
  7. order by datetime
nfs0ujit

nfs0ujit2#

  1. CREATE TABLE yourtable ([datetime] datetime, datacenter varchar(10),machines INT)
  2. insert into yourtable ([datetime],datacenter,machines) VALUES
  3. ('2020-05-13 12:00:00.000' , 'DC01' , 500 ),
  4. ('2020-05-13 12:00:00.000' , 'DC02' , 100 ),
  5. ('2020-04-10 13:00:00.000', 'DC01' , 510),
  6. ('2020-04-10 13:00:00.000', 'DC02' , 120),
  7. ('2020-03-1 14:00:00.000', 'DC01' , 530),
  8. ('2020-03-1 14:00:00.000', 'DC02' , 140)
  1. DECLARE @cols AS NVARCHAR(MAX),
  2. @query AS NVARCHAR(MAX);
  3. SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.datacenter)
  4. FROM yourtable c
  5. FOR XML PATH(''), TYPE
  6. ).value('.', 'NVARCHAR(MAX)')
  7. ,1,1,'')
  8. set @query = 'SELECT [datetime], ' + @cols + ' from
  9. (
  10. select [datetime],datacenter,machines
  11. from yourtable
  12. ) x
  13. pivot
  14. (
  15. max(machines)
  16. for datacenter in (' + @cols + ')
  17. ) p '
  18. execute(@query)
  1. datetime | DC01 | DC02
  2. :---------------------- | ---: | ---:
  3. 2020-03-01 14:00:00.000 | 530 | 140
  4. 2020-04-10 13:00:00.000 | 510 | 120
  5. 2020-05-13 12:00:00.000 | 500 | 100

db<>在这里摆弄

展开查看全部

相关问题