2017-07-17 3 views
0

J'essaie de compter tous les identifiants distincts en fonction des conditions. Mais je suis incapable de comprendre où je vais mal avec la syntaxe. La logique estPL/SQL: Besoin d'aide pour créer des colonnes calculées en fonction des conditions. à faire dans une requête select

COUNTD(IF ([column_name1] = 1) THEN [DATAPAGEID] END) 

Cette formule est utilisée dans Tableau. Toutefois, lors de l'écriture dans une requête PL/SQL comme

Select FT.NAME, COUNT(DISTINCT FT.pageID IF FT."column_name" = 1) 
as total_expected 
FROM 
(Sub Query) FT 
Group by FT.Name 
Order by FT.Name 

Inutile de dire ses erreurs de lancement. Maintenant, je peux écrire des requêtes séparées qui peuvent me donner chaque numéro en utilisant une condition where. Par exemple, si je voulais un compte de pageid distincts où de colonne 1 = 1, je voudrais écrire quelque chose comme ça

 Select FT.SITENAME, COUNT(DISTINCT DATAPAGEID) as Datapage 
     from 
      (sub query) 
     WHERE FT."column_name" = 1 

mais le problème avec cela est que j'ai d'autres colonnes calculées dans la requête qui devra être tous partie de la même rangée. Pour illustrer, voici ce que la table ressemblerait

 name  Calculated_Column1 Calculated_Column2 Calculated_column3 
     abc  781     811     96.54% 
     pqr  600     800     75.00% 

où calculated_column3 est le résultat de 781/811. Par conséquent, je ne peux pas avoir une nouvelle requête pour chaque colonne. Je pensais que l'utilisation d'une condition if lors du calcul des colonnes permettrait de résoudre ce problème, mais je ne peux pas obtenir la syntaxe correcte en quelque sorte. Par conséquent, j'ai besoin de savoir comment je peux créer des colonnes calculées conditionnelles dans la requête de sélection. Si je ne l'ai pas bien expliqué, s'il vous plaît faites le moi savoir et je vais essayer de clarifier davantage.

Répondre

1

Vous pouvez utiliser un bloc CASE à l'intérieur du count (DISTINCT) comme indiqué.

SELECT FT.NAME, 
    COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 1 
    THEN 1 
    ELSE 0 
    END) Calculated_Column1, 
    COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 2 
    THEN 1 
    ELSE 0 
    END) Calculated_Column2, 
    (COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 1 
    THEN 1 
    ELSE 0 
    END)/COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 2 
    THEN 1 
    ELSE 0 
    END)) * 100||'%' Calculated_Column3 
FROM 
    (SELECT 'abc' name, 1 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'abc' name, 1 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'pqr' name, 2 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'pqr' name, 2 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'pqr' name, 3 DATAPAGEID FROM dual 
) FT 
GROUP BY FT.Name 
ORDER BY FT.Name; 

sortie est

abc 1 1 100% 
pqr 1 2 50%