Подсчет нескольких строк в SQL Server Query - PullRequest
0 голосов
/ 29 июня 2009

У меня есть эта таблица с именем Online_Transaction, и я хочу показать все типы транзакций и сколько было сделано каждого типа (выполненных, отклоненных, ожидающих авторизации) в конкретном месяце. У меня есть этот запрос до сих пор, но я получаю повторяющиеся результаты какие-либо идеи?

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    

И я получаю эти результаты:

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           

Как видите, результаты повторяются, если в таблице должны быть разные значения.
Есть идеи?


Попробовав ответы ниже, вот что я получаю: этот тип набора результатов - он отображает разные результаты для каждого типа транзакции в разных строках, так что если, скажем, тип транзакции - внутрипередача, и у меня 10 выполненных и 2 отклоненных, то он будет отображать выполненные в одной строке, а отклоненные в другой как вы показываете это в одной строке для типа транзакции

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

Запрос выглядит так:

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

Ответы [ 5 ]

2 голосов
/ 29 июня 2009

Я опробовал другие ответы только для собственного назидания и подумал, что поделюсь результатами, если это кому-нибудь поможет. Набор данных небольшой, но показывает принцип.

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 голосов
/ 29 июня 2009
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)

Посмотрите, имеет ли это смысл.

0 голосов
/ 29 июня 2009

Предложения where в вложенных операторах select не различают различные типы транзакций Числа всегда являются общими суммами.

Попробуйте заглянуть в сумму и кейс.

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 голосов
/ 29 июня 2009

Ваши скобки SELECT в главном предложении SELECT возвращаются к итоговой таблице ONLINE_TRANSACTION, поэтому, конечно, они получают свои значения независимо от типа, но скорее всего!

Как насчет замены каждого из них на SUM (по той же группировке, что у вас уже есть, поэтому дополнительный синтаксис не требуется) проверок STATUS_ID - взятие 1 за равенство и 0 за разность (что означает 0 Преобразование / 1 int является автоматическим во многих диалектах SQL, в худшем случае вам понадобится IF или CASE...WHEN или CAST для этого, независимо от вашего предпочтительного диалекта).

0 голосов
/ 29 июня 2009

Вам понадобится еще одно предложение WHERE в ваших подзапросах, связывающих идентификаторы TRANSACTION_TYPE_ID.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...