0
votes

Oracle SQL transposant une seule valeurs de colonne en tant que colonnes séparées de la sortie

mon SQL;

    SELECT
        created_date,
        response_status,
        count
    FROM
        t_bvs_txn_response_summary
    WHERE
        created_date > SYSDATE - 1 / 24
        AND   response_status IN (
            'successful',
            'Disconnection'
        )
    ORDER BY
        1;


0 commentaires

3 Réponses :


3
votes

Essayez PIVOT

SELECT * FROM (
     SELECT
            created_date, 
            response_status,
            nvl(count,0) as count
        FROM
            t_bvs_txn_response_summary
        WHERE
            created_date > SYSDATE - 1 / 24
            AND   response_status IN (
                'successful',
                'Disconnection'
            )
)
PIVOT
(
  SUM(count)
  FOR response_status IN ('successful', 'Disconnection')
)
        ORDER BY
            1;


6 commentaires

Non, il s'agit simplement de regrouper la colonne de réponse_status qui n'est pas la sortie souhaitée. J'ai mis à jour la question et montré la sortie souhaitée.


Avec peu de modifications à votre code, cela a fonctionné mais il faut montrer zéro au lieu de NULL au cas où il n'y a rien trouvé pour cet exemple particulier. Je devais ajouter compter dans la fonction de sélection interne, puis la fonction de somme après pivot.


Si vous modifiez votre code, cela peut être marqué comme une réponse correcte.


@khalidmehmoodawan j'ai édité maintenant mon code selon votre commentaire


Puisse si vous travaillez sur la section 0 au lieu de NULLS au cas où aucun compte / somme n'est trouvé, cela améliorera encore la réponse. Merci .


@khalidmehmoodawan j'ai ajouté NVL (compte, 0), il devrait faire le tour



0
votes

Cette approche n'est utilisée que si vous souhaitez récupérer toutes les colonnes restantes et compte également. Les comptes seront répétés.

   SELECT
        created_date,
        response_status,
        count,count(*) over(partition by response_status)
    FROM
        t_bvs_txn_response_summary
    WHERE
        created_date > SYSDATE - 1 / 24
        AND   response_status IN (
            'successful',
            'Disconnection'
        )
    ORDER BY
        1;


0 commentaires

4
votes

Vous pouvez essayer d'utiliser une agrégation conditionnelle

    SELECT 
      created_date,
      sum(case when response_status='successful' then count end ) as 'successful',
      sum(case when response_status='Disconnection' then count end) as 'Disconnection'
      FROM t_bvs_txn_response_summary
      WHERE created_date > SYSDATE - 1 / 24 AND response_status IN ('successful', 'Disconnection')
      group by created_date


1 commentaires

Oui, celui-ci a également travaillé mais pouvons-nous utiliser pivot et éviter si et au cas?