2017-10-16 12 views
0

J'ai les résultats d'une analyse de sentiment dans une colonne. Je voudrais montrer ce que chaque numéro représente et le compte, comme ceci:Comment combiner les résultats de différentes requêtes en une seule?

Neg | Neutral | Pos 
---------+-----+----- 
    30 | 55 | 100 

J'ai essayé de nombreuses approches différentes que j'ai trouvé sur Internet, en vain. Il semble que la syntaxe db2 change fréquemment, et toute la documentation que j'ai trouvée ne fonctionne pas sur mon compte bluemix actuel.

Le plus proche que je peux obtenir est avec UNION:

SELECT COUNT(*) as NEGATIVE  FROM C7 WHERE SENTIMENT = 1 
union 
SELECT COUNT(*) as NEUTRAL  FROM C7 WHERE SENTIMENT = 2 
union 
SELECT COUNT(*) as Pos   FROM C7 WHERE SENTIMENT = 3 

Cependant, cela me donne:

NEGATIVE 
-------- 
    30 
    55 
    100 

Comment puis-je combiner les résultats de chaque côté par côté requête?


J'ai essayé les réponses de la Pivotant dans DB2 post, mais je m'y suis des erreurs:

SELECT 
    C7.SENTIMENT, 
    COUNT(CASE WHEN C7.SENTIMENT = 1 THEN Value END) AS NEGATIVE, 
    COUNT(CASE WHEN C7.SENTIMENT = 2 THEN Value END) AS NEUTRAL, 
    COUNT(CASE WHEN C7.SENTIMENT = 3 THEN Value END) AS POSITIVE, 
FROM C7 
GROUP BY C7.SENTIMENT 

SQL0206N: SQL0206N "VALUE" est pas valable dans le contexte où il est utilisé. SQLSTATE = 42703

SELECT DISTINCT 
    C7.SENTIMENT, 
    (SELECT value FROM C7 WHERE C7.SENTIMENT = 1) AS VERY_NEGATIVE, 
    (SELECT value FROM C7 WHERE C7.SENTIMENT = 2) AS NEGATIVE, 
    (SELECT value FROM C7 WHERE C7.SENTIMENT = 3) AS NEUTRAL 
FROM C7 

SQL0206N: SQL0206N "VALUE" est pas valable dans le contexte où il est utilisé. SQLSTATE = 42703

+1

Copie possible de [Pivoter dans DB2] (https://stackoverflow.com/questions/15529107/pivoting-in-db2) –

+0

@ Clockwork-Muse Nope, essayé toutes ces réponses, non travaillé, mettra à jour mon message avec pourquoi ce n'est pas ça. Merci quand même. –

+0

Il est probable que "VALUE" soit utilisé comme mot clé ici (puisqu'il s'agit d'un mot réservé, bien qu'il puisse être utilisé comme nom de colonne dans au moins certains contextes). Mais à moins que tout ce à quoi vous essayez de vous référer puisse être nul, vous ne vous souciez pas de ce qu'il contient, vous pouvez donc substituer une valeur constante ('1' est un favori). (De mon expérience colonne non-trouvé donne une exception différente, donc pas susceptible d'en découler) –

Répondre

1

OK, donc après quelques réponses retravaillant, j'ai finalement obtenu ce que je cherchais:

SELECT DISTINCT 
    (SELECT COUNT(SENTIMENT) FROM C7 WHERE C7.SENTIMENT = 1) AS NEGATIVE, 
    (SELECT COUNT(SENTIMENT) FROM C7 WHERE C7.SENTIMENT = 2) AS NEUTRAL, 
    (SELECT COUNT(SENTIMENT) FROM C7 WHERE C7.SENTIMENT = 3) AS POSITIVE 
FROM C7 

Cela semble être quelque chose que j'oscillé autour depuis longtemps, mais ne pouvait pas trouver parce que certains messages répondent à la question avec des noms de table et des valeurs bizarres.

Donc, fondamentalement, pour obtenir des requêtes les unes à côté des autres, vous devez utiliser plusieurs SELECT s.

En outre, notez que j'ai utilisé DISTINCT car sinon, il aurait donné une copie des mêmes données pour chaque ligne de ma base de données.

+0

.... 'DISTINCT' est inutile, car si vous allez sur cette route, vous devriez faire quelque chose de différent, soit en les mettant tous les trois dans une instruction' VALUES', soit en utilisant la table fictive ('sysibm.sysdummy1') pour vous donner la seule rangée. Si vous avez de la chance, le système est capable de regarder cette requête et d'optimiser le 'DISTINCT', sinon vous ne faites que vous pénaliser. –

+0

@ Clockwork-Muse OK, postez une réponse. –