2010-03-15 22 views
1

J'ai fondamentalement 7 instructions select dont j'ai besoin pour que les résultats soient affichés dans des colonnes séparées. Normalement, j'utiliserais un tableau croisé pour cela, mais j'ai besoin d'un moyen rapide et efficace pour y arriver car il y a plus de 7 milliards de lignes dans la table. J'utilise le système de base de données de Vertica. Voici un exemple de mes déclarations:Comment mettre plusieurs instructions de sélection dans différentes colonnes

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 

devrait retourner quelque chose comme:

20100101 | 20100102 | 20100103 | 20100104 | 20100105 | 20100106 | 20100107 
1234  | 1234  | 36564 | 45465 | 356754 | 3455  | 4556675 

Répondre

2

Vous pouvez utiliser une série de requêtes unies ensemble. Sorte de laid, mais il devrait fonctionner

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

j'aime ça, je pense que je vais l'utiliser. bien jusqu'à ce qu'ils me demandent de sortir un an :-p –

2

les envelopper entre parenthèses, ajouter des virgules et les sélectionner :)

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' 

Ou vous pouvez faire une fonction scalaire qui prend comme paramètre le date_dim_id et renvoie le résultat que vous voulez, et l'appelle plusieurs fois. (si votre système DB supporte les fonctions scalaires)

+0

Je pensais à cela, mais dans Vertica, les sous-requêtes ne sont pas pris en charge dans la liste de sélection d'une requête. –

+0

@Russ, ok désolé à ce sujet .. je supposais qu'il soutiendrait ce .. ne peut pas offrir beaucoup d'autre .. –

+0

Bien que ce soit une réponse vraiment ancienne, je voulais juste dire que cela fonctionne très bien comme aujourd'hui dans 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

Eh bien, pensez à utiliser un tableau croisé dynamique. C'est plus EyeCandy :)

Tout d'abord l'union de vos résultats, que de le faire pivoter!

Heres votre exemple, et est ici 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 
Questions connexes