SQL с несколькими подсчетами против одной дочерней таблицы - PullRequest
0 голосов
/ 04 марта 2011

База данных DB2.Запрос может иметь несколько транзакций.Я хотел бы запросить запрос и получить количество различных типов транзакций.Таким образом, запрос 1 с четырьмя транзакциями (AA, BB, BB, CC) приведет к: REQ = 1234, REQ_USER = 'Сьюзен', REQ_ACCT = 223344, CNT_AA = 1, CNT_BB = 2, CNT_CC = 3

Этозапрос дает мне точный счет одного типа транзакции:

SELECT COUNT(*) AS TRANS_AA
FROM TABLE1 AS T1, TABLE2 AS T2
WHERE T1.REQUEST_ID=1234 
AND T1.COMPONENTID = T2.PARENTCOMPID
AND T2.TRANS_TYPE='AA';

Если я также хочу идентификатор запроса, этот запрос дает мне это, но мне нужно, чтобы идентификатор запроса «Группировать по»:

SELECT T1.REQUEST_ID, COUNT(*) AS TRANS_AA
FROM TABLE1 AS T1, TABLE2 AS T2
WHERE T1.REQUEST_ID=1234 
AND T1.COMPONENTID = T2.PARENTCOMPID
AND T2.TRANS_TYPE='AA'
GROUP BY T1.REQUEST_ID;

Я не уверен, как добавить несколько столбцов из T1 (пользователь, учетная запись и т. Д.) И несколько типов транзакций (скажем, у нас есть 10 различных типов).Я пробовал некоторые ВНУТРЕННИЕ СОЕДИНЕНИЯ между ними, но не уверен, что это можно сделать эффективно, или одно СОЕДИНЕНИЕ для всех подсчетов, или несколько объединений и т. Д.

Я разместил образец данных, которые я 'Я хотел бы вернуться, но по запросу ниже.

TABLE1
componentid (key)
request_id
req_user
req_account
... 27 more columns

TABLE 2 (child table, could have many trans_types for T1)
parentcompid (foreign key to componentid in Table1)
trans_type

1 Ответ

0 голосов
/ 04 марта 2011

Вы можете использовать для этого WINDOW-функции DB2.

Вы можете переписать свой существующий запрос следующим образом:

SELECT T1.REQUEST_ID, COUNT(1) OVER(PARTITION BY T1.REQUEST_ID) AS TRANS_ABC 
  FROM TABLE1 AS T1, TABLE2 AS T2 
 WHERE T1.REQUEST_ID=1234  
   AND T1.COMPONENTID = T2.PARENTCOMPID 
     AND T2.TRANS_TYPE='ABC' 

Вы можете использовать любой столбец в списке выбора, когда используетеоконная функция.Обратитесь по ссылке ниже для получения дополнительной информации:

http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0023461.htm

Если вы хотите, чтобы данные были повернуты, я не уверен, что DB2 по своей природе поддерживает PIVOT / UNPIVOT.Это лучшее, что я могу построить (хотя не уверен насчет производительности и не проверял запрос):

ПРИМЕЧАНИЕ. В этом запросе рассматриваются 6 различных типов trans_types.Если Trans_Type не является конечным, я не уверен, что будет какое-либо простое решение.

SELECT *
  FROM (
                SELECT  t1.request_id, 
                                t1.req_user, 
                                t1.req_acct, 
                                SUM(DECODE(trans_type, 'AA',1, 0)) OVER(PARTITION BY t1.request_id) AS trans_aa, 
                                SUM(DECODE(trans_type, 'BB',1, 0)) OVER(PARTITION BY t1.request_id) AS trans_bb, 
                                SUM(DECODE(trans_type, 'CC',1, 0)) OVER(PARTITION BY t1.request_id) AS trans_cc, 
                                SUM(DECODE(trans_type, 'DD',1, 0)) OVER(PARTITION BY t1.request_id) AS trans_dd, 
                                SUM(DECODE(trans_type, 'EE',1, 0)) OVER(PARTITION BY t1.request_id) AS trans_ee, 
                                SUM(DECODE(trans_type, 'FF',1, 0)) OVER(PARTITION BY t1.request_id) AS trans_ff,
                                        SUM(1) AS total_trans
                                ROW_NUMBER() OVER(PARTITION BY t1.request_id) AS rn
                FROM TABLE1 AS t1, TABLE2 AS t2
                WHERE t1.request_id=1234 AND t1.componentid = t2.parentcompid
            ) a
 WHERE rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...