如何把多个SELECT语句到不同的列
-
20-09-2019 - |
题
我基本上有我需要有结果输出到单独的列7的选择语句。通常我会用这个交叉表,但我需要一个快速有效的方式去了解这个,因为在表中有超过7十亿行。我使用的Vertica的数据库系统。下面是我的语句的示例:
SELECT COUNT(user_id) AS '20100101' FROM event_log_facts WHERE date_dim_id=20100101
SELECT COUNT(user_id) AS '20100102' FROM event_log_facts WHERE date_dim_id=20100102
SELECT COUNT(user_id) AS '20100103' FROM event_log_facts WHERE date_dim_id=20100103
SELECT COUNT(user_id) AS '20100104' FROM event_log_facts WHERE date_dim_id=20100104
SELECT COUNT(user_id) AS '20100105' FROM event_log_facts WHERE date_dim_id=20100105
SELECT COUNT(user_id) AS '20100106' FROM event_log_facts WHERE date_dim_id=20100106
SELECT COUNT(user_id) AS '20100107' FROM event_log_facts WHERE date_dim_id=20100107
应该返回类似:
20100101 | 20100102 | 20100103 | 20100104 | 20100105 | 20100106 | 20100107
1234 | 1234 | 36564 | 45465 | 356754 | 3455 | 4556675
解决方案
您可以使用一系列联合在一起的查询在一起。样的难看,但它应该工作
SELECT
COUNT(user_id) AS '20100101'
,NULL AS '20100102'
,NULL AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100101
UNION
SELECT
NULL AS '20100101'
,COUNT(user_id) AS '20100102'
,NULL AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100102
UNION
SELECT
NULL AS '20100101'
,NULL AS '20100102'
,COUNT(user_id) AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100103
... ETC
其他提示
将它们包装在括号中,加逗号和选择它们:)
SELECT
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100101) AS '20100101',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100102) AS '20100102',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100103) AS '20100103',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100104) AS '20100104',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100105) AS '20100105',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100106) AS '20100106',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100107) AS '20100107'
或者你可以做一个标量函数,它的参数date_dim_id并返回你想要的结果,并称之为多次..(如果您的数据库系统支持的标量函数的)
SELECT
COUNT(date_dim=20100101 OR NULL) AS '20100101',
COUNT(date_dim=20100102 OR NULL) AS '20100102',
...
FROM event_log_facts
那么,可以考虑使用透视表。它更EyeCandy的:)
首先工会的结果,比转动它!
下面有你的例子,这里是的SQLFiddle - > http://sqlfiddle.com/# !6 / d41d8 / 6440
SELECT PivT.*
FROM
(
SELECT 10 As Quantity, '20100101' AS DateDim
UNION
SELECT 21 , '20100102'
UNION
SELECT 3 , '20100103'
UNION
SELECT 41 , '20100104'
UNION
SELECT 50 , '20100105'
UNION
SELECT 26 , '20100106'
UNION
SELECT 78 , '20100107'
) T
PIVOT (avg(Quantity) for DateDim in ([20100101],
[20100102],
[20100103],
[20100104],
[20100105],
[20100106],
[20100107])
) As PivT
不隶属于 StackOverflow