将多个汇总查询合并为一个插入语句

时间:2019-08-29 23:48:21

标签: sql sql-server

我正在尝试使用时间序列数据创建数据库,并且我试图将4个不同的查询融合在一起以形成单个插入的一组数据。

SELECT 'some date' AS date, a, b, COUNT(foo) AS c
FROM 'my_db'
WHERE date BETWEEN dateadd(hour,-24,'some date') AND dateadd(hour,-23,'some date')
GROUP BY a, b
ORDER BY a, b ASC;


SELECT a, b, COUNT(foo) AS c1
FROM 'my_db'
WHERE (date BETWEEN dateadd(hour,-24,'some date') AND dateadd(hour,-23,'some date'))
    AND (foo = 'some value')
GROUP BY a, b
ORDER BY a, b ASC;


SELECT a, b, COUNT(foo) AS c2
FROM 'my_db'
WHERE (date BETWEEN dateadd(hour,-24,'some date') AND dateadd(hour,-23,'some date'))
    AND (foo = 'some other value')
GROUP BY a, b
ORDER BY a, b ASC;

如果它们在单独的表中,我觉得我可以分别对字段ab进行完全外部联接,然后用0填充空白字段。

最后,我将能够进入数据集以使单个插入看起来像这样:

|         date        |   a   |   b   |   c   |   c1    |    c2    |
--------------------------------------------------------------------
| 2019-08-27 12:00:00 |  dog  |  woof |  100  |   76    |    26    |
| 2019-08-27 12:00:00 |  cat  |  meow |   82  |   33    |    49    |
| 2019-08-27 12:00:00 | pony  | neigh |  300  |    0    |   300    |

是否有一种干净的方法将这些查询组合成一个查询,以便我可以批量插入格式化的集?

还是有解决问题的更聪明的方法?

1 个答案:

答案 0 :(得分:2)

我认为您需要条件聚合:

SELECT 'some date' AS date, a, b, COUNT(foo) AS c,
       SUM(CASE WHEN foo = 'some value' THEN 1 ELSE 0 END) as c1,
       SUM(CASE WHEN foo = 'some other value' THEN 1 ELSE 0 END) as c2
FROM 'my_db'
WHERE date BETWEEN dateadd(hour, -24, 'some date') AND dateadd(hour, -23, 'some date')
GROUP BY a, b
ORDER BY a, b ASC;