2010-03-15 40 views
1

我基本上有7個選擇語句,我需要將結果輸出到不同的列中。通常我會爲此使用交叉表,但我需要一種快速有效的方法來解決這個問題,因爲表中有超過70億行。我正在使用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 

回答

2

您可以使用一系列聯合在一起的查詢。的醜樣,但它應該工作

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 ...

+0

我喜歡這個,我想我會用這個。直到他們要求我出去一年: - p – 2010-03-16 20:57:05

2

包起來括號,加逗號和選擇它們:)

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作爲參數並返回所需結果,並多次調用它。(如果您的數據庫系統支持標量函數

+0

我想到這一點,但在Vertica的,子查詢並不在查詢的選擇列表的支持。 – 2010-03-15 22:26:28

+0

@Russ,好吧對不起。..我認爲它會支持這個..不能提供其他許多.. – 2010-03-15 23:02:52

+0

雖然這是一個非常古老的答案,但我只是想說,今天在Vertica分析型數據庫v7.0.1-4 – 2015-12-17 13:07:04

1
SELECT 
COUNT(date_dim=20100101 OR NULL) AS '20100101', 
COUNT(date_dim=20100102 OR NULL) AS '20100102', 
... 
FROM event_log_facts 
0

好,可以考慮使用數據透視表。它更EyeCandy :)

首先結合你的結果,而不是支點它!

繼承人你的例子,這裏是the 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