2010-03-15 3 views
1

У меня в основном есть 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 

ответ

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 –

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, подзапросы не поддерживаются в списке выбора запроса. –

+0

@ Russ, извините, об этом .. Я предположил, что это поддержит это .. не может предложить многое другое. –

+0

Хотя это действительно старый ответ, я просто хотел сказать, что это работает отлично, как сегодня в Vertica Analytic Database v7.0.1-4 –

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

Ну, рассмотреть возможность использования сводной таблицы. Это больше EyeCandy :)

Сначала объедините свои результаты, чем поверните его!

Heres ваш пример, а вот 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