2009-06-29 7 views
0

J'ai cette table appelée Online_Transaction et je veux montrer tous les types de transactions et combien de chaque fait de chaque type (achevé, rejeté, en attente d'autorisation) dans un mois spécifique. J'ai cette requête jusqu'à maintenant mais je reçois des résultats répétés des idées?Compte plusieurs lignes dans SQL Server Query

SELECT DISTINCT 
    TRANSACTION_TYPE_ID , 
    YEAR(CREATED_ON) AS YEAR , 
    MONTH(CREATED_ON) AS MONTH , 
    (SELECT 
      Count(TRANSACTION_TYPE_ID) 
     FROM 
      ONLINE_TRANSACTION 
     WHERE 
      ONLINE_TRANSACTION.STATUS_ID = 'COMPLETED' AND MONTH(CREATED_ON) = '2') AS COMPLETED , 
    (SELECT 
      Count(TRANSACTION_TYPE_ID) 
     FROM 
      ONLINE_TRANSACTION 
     WHERE 
      ONLINE_TRANSACTION.STATUS_ID = 'DECLINED' AND MONTH(CREATED_ON) = '2') AS DECLINED , 
    (SELECT 
      Count(TRANSACTION_TYPE_ID) 
     FROM 
      ONLINE_TRANSACTION 
     WHERE 
      ONLINE_TRANSACTION.STATUS_ID = 'FAILED' AND MONTH(CREATED_ON) = '2') AS FAILED , 
    (SELECT 
      Count(TRANSACTION_TYPE_ID) 
     FROM 
      ONLINE_TRANSACTION 
     WHERE 
      ONLINE_TRANSACTION.STATUS_ID = 'PENDING_AUTH' AND MONTH(CREATED_ON) = '2') AS PENDING_AUTH 
--(SELECT Count(*) from) 
FROM 
    ONLINE_TRANSACTION 
WHERE 
    MONTH(CREATED_ON) = '2' 
GROUP BY 
    TRANSACTION_TYPE_ID , 
    ONLINE_TRANSACTION.CREATED_ON  

Et je reçois ces résultats:

TRANSACTION_TYPE_ID     YEAR  MONTH  COMPLETED DECLINED FAILED  
------------------------------------ ----------- ----------- ----------- ----------- ------- 
INSURANCE--TYPE      2009  2   9712  177   0   
CHEQUEBOOK-TYPE      2009  2   9712  177   0   
CHEQUE-STOP-YPE      2009  2   9712  177   0   
PAYMENT-TRANS-TYPE    2009  2   9712  177   0   
DOMESTIC-TRANSFER-TYPE    2009  2   9712  177   0 
PAYMENT-TRANS-TYPE    2009  2   9712  177   0   
INTRA-ACCOUNT-TRANS-TYPE    2009  2   9712  177   0   
INTRA-BANK-TRANS-TYPE     2009  2   9712  177   0   
STANDING-ORDER-TYPE     2009  2   9712  177   0   
STATEMENT-REORDERING TYPE    2009  2   9712  177   0   
PAYMENTS-TRANS-TYPE    2009  2   9712  177   0   

Comme vous pouvez le voir les résultats sont répétés, wheres dans le tableau, il devrait être différentes valeurs.
Des idées?


Après avoir essayé les réponses ci-dessous ce que je reçois: ce type de résultats SET- il affiche des résultats différents pour chaque type de transaction dans différentes lignes, donc si dire le type de transaction est intra-transfert et i a 10 complété et 2 rejeté, il montrera le complété dans une rangée et le rejeté dans une autre rangée? comment faire votre spectacle dans une ligne par type de transaction

TRANSACTION_TYPE_ID  YEAR MONTH REJECTED COMPLETED POSTED 

ALPHA-INSURANCE-TRANS-TYPE 2009 2  0 12 0 
CHEQUEBOOK-ORDER-TRANS-TYPE 2009 2  0 0 0 
CHEQUEBOOK-ORDER-TRANS-TYPE 2009 2  0 52 0 
CHEQUEBOOK-ORDER-TRANS-TYPE 2009 2  2 0 0 
CHEQUE-STOP-TRANS-TYPE  2009 2  0 3 0 
PAYMENT-TRANS-TYPE   2009 2  0 361 0 
PAYMENT-TRANS-TYPE   2009 2  1 0 0 
DOMESTIC-TRANSFER-TRANS-TYPE 2009 2 0 0 0 
DOMESTIC-TRANSFER-TRANS-TYPE 2009 2 0 541 0 
DOMESTIC-TRANSFER-TRANS-TYPE 2009 2 6 0 0 

la requête ressemble à ceci:

SELECT DISTINCT 
    TRANSACTION_TYPE_ID , 
    YEAR(CREATED_ON) AS YEAR , 
    MONTH(CREATED_ON) AS MONTH , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'STATUS-TRANS-REJECTED ' THEN 1 
      ELSE 0 
     END) AS REJECTED , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'STATUS-TRANS-COMPLETED ' THEN 1 
      ELSE 0 
     END) AS COMPLETED , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'STATUS-TRANS-DECLINDED ' THEN 1 
      ELSE 0 
     END) AS DECLINED , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'STATUS-TRANS-FAILED' THEN 1 
      ELSE 0 
     END) AS FAILED , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'STATUS-TRANS-PENDING-AUTH ' THEN 1 
      ELSE 0 
     END) AS PENDING_AUTH , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'STATUS-TRANS-PENDING-POST ' THEN 1 
      ELSE 0 
     END) AS PENDING_POST , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'STATUS-TRANS-PENDING' THEN 1 
      ELSE 0 
     END) AS PENDING , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID 
      WHEN 'ALPHA-STATUS-TRANS-POSTED' THEN 1 
      ELSE 0 
     END) AS POSTED 
FROM 
    ONLINE_TRANSACTION 
WHERE 
    MONTH(CREATED_ON) = '2' 
GROUP BY 
    TRANSACTION_TYPE_ID , 
    YEAR(CREATED_ON) , 
    MONTH(CREATED_ON) , 
    STATUS_ID 
+0

@Alex: Qu'avez-vous utilisé pour la mise en forme de la table? – shahkalpesh

+0

@Alex: c'est ce que j'essaie de comprendre? bloc citation? problème –

+0

est comme ci-dessus, je me répéter des lignes pour des résultats vides –

Répondre

0

Vous avez besoin une autre clause WHERE dans vos requêtes sous reliant les TRANSACTION_TYPE_IDs vers le haut.

SELECT DISTINCT 
    TRANSACTION_TYPE_ID, YEAR(CREATED_ON)AS YEAR, MONTH(CREATED_ON)AS MONTH , 
(SELECT Count(TRANSACTION_TYPE_ID) FROM ONLINE_TRANSACTION 
WHERE ONLINE_TRANSACTION.STATUS_ID ='COMPLETED'AND MONTH(CREATED_ON)='2' 
    AND TRANSACTION_TYPE_ID=ot.TRANSACTION_TYPE_ID) AS COMPLETED, 
(SELECT Count(TRANSACTION_TYPE_ID) FROM ONLINE_TRANSACTION 
WHERE ONLINE_TRANSACTION.STATUS_ID ='DECLINED'AND MONTH(CREATED_ON)='2' 
    AND TRANSACTION_TYPE_ID=ot.TRANSACTION_TYPE_ID) AS DECLINED, 
(SELECT Count(TRANSACTION_TYPE_ID) from ONLINE_TRANSACTION 
WHERE ONLINE_TRANSACTION.STATUS_ID ='FAILED' AND MONTH(CREATED_ON)='2' 
    AND TRANSACTION_TYPE_ID=ot.TRANSACTION_TYPE_ID) AS FAILED, 
(SELECT Count(TRANSACTION_TYPE_ID) from ONLINE_TRANSACTION 
WHERE ONLINE_TRANSACTION.STATUS_ID ='PENDING_AUTH'AND MONTH(CREATED_ON)='2' 
    AND TRANSACTION_TYPE_ID=ot.TRANSACTION_TYPE_ID) AS PENDING_AUTH 
FROM ONLINE_TRANSACTION ot 
WHERE MONTH(CREATED_ON)='2' 
GROUP BY TRANSACTION_TYPE_ID,ONLINE_TRANSACTION.CREATED_ON 
0

Les clauses where des instructions select imbriquées ne font pas la distinction entre les différents types de transaction. Les chiffres sont toujours les montants totaux.

Essayez d'examiner la somme et la casse.

TRANSACTION_TYPE_ID, YEAR(CREATED_ON)AS YEAR, MONTH(CREATED_ON)AS MONTH , 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID WHEN 'COMPLETED' THEN 1 ELSE 0 END) AS COMPLETED, 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID WHEN 'DECLINED' THEN 1 ELSE 0 END) AS DECLINED, 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID WHEN 'FAILED' THEN 1 ELSE 0 END) AS FAILED, 
    SUM(CASE ONLINE_TRANSACTION.STATUS_ID WHEN 'PENDING_AUTH' THEN 1 ELSE 0 END) AS PENDING_AUTH 
FROM ONLINE_TRANSACTION WHERE MONTH(CREATED_ON)='2' 
GROUP BY TRANSACTION_TYPE_ID 
0

Votre SELECT s dans votre parenthétiques principale clause SELECT remontent à la ONLINE_TRANSACTION totale table pour bien sûr, ils obtiennent leurs comptes sans égard au type, mais dans l'ensemble! Qu'en est-il de changer chacun d'entre eux en SUM (sur le même groupe que vous avez déjà, donc pas de syntaxe supplémentaire nécessaire) des contrôles STATUS_ID - en prenant 1 pour l'égalité et 0 pour la différence (ce bool à 0/1 int la conversion est automatique dans de nombreux dialectes SQL, au pire vous aurez besoin d'un IF ou CASE...WHEN ou CAST pour cela, quel que soit votre dialecte de choix).

0
SELECT TRANSACTION_TYPE_ID, YEAR(CREATED_ON) AS YEAR, MONTH(CREATED_ON) AS MONTH , 
SUM(CASE WHEN STATUS_ID = 'COMPLETED' THEN 1 ELSE 0 END) AS Completed, 
SUM(CASE WHEN STATUS_ID = 'DECLINED' THEN 1 ELSE 0 END) AS Declined, 
SUM(CASE WHEN STATUS_ID = 'FAILED' THEN 1 ELSE 0 END) AS Failed, 
SUM(CASE WHEN STATUS_ID = 'PENDING_AUTH' THEN 1 ELSE 0 END) AS Pending_Auth 
FROM ONLINE_TRANSACTION 
WHERE MONTH(CREATED_ON) = 2 
GROUP BY TRANSACTION_TYPE_ID, YEAR(CREATED_ON), MONTH(CREATED_ON) 

Voir si cela a du sens.

+0

J'ai essayé, mais je reçois le texte suivant: Msg 8117, niveau 16, état 1, ligne 2 type de données Opérande varchar est valide pour l'opérateur de somme. –

+0

C'est surprenant.Essayez d'enlever les clauses SUM sauf 1 et voyez si cela fonctionne. – shahkalpesh

+0

S'il vous plaît voir ma réponse ci-dessous. –

2

J'ai essayé le otheranswers juste pour ma propre édification, et j'ai pensé partager les résultats au cas où cela aiderait quelqu'un d'autre. L'ensemble de données est petit, mais montre le principe.

sqlite> SELECT * FROM transactions; 
id   type_id  status_id 
---------- ---------- ---------- 
1   insurance completed 
2   insurance declined 
3   cheque-stop completed 
4   cheque-stop completed 

sqlite> SELECT 
    ...>  type_id, 
    ...>  SUM(status_id == 'completed') AS completed, 
    ...>  SUM(status_id == 'declined') AS declined 
    ...> FROM transactions 
    ...> GROUP BY type_id; 
type_id  completed declined 
----------- ---------- ---------- 
cheque-stop 2   0 
insurance 1   1 
+0

pourquoi j'obtiens cette erreur: Le type de données d'opérande varchar n'est pas valide pour l'opérateur sum. –

+0

Je suppose que ce serait la syntaxe mysql. OP demande la syntaxe TSQL. – shahkalpesh

+0

@Andreas: Mon exemple provient de SQLite3, un moteur de base de données différent de SQL Server de Microsoft. –

Questions connexes