Информация SQL показана в одной строке - PullRequest
0 голосов
/ 12 октября 2018
SELECT CA.MEMBER_ID,
    0 AS TRANSFERRED_SHARES ,
    SUM(CA.NUMBER_OF_SHARES) AS PURCHASED_SHARES, 
    '-' AS DELETED_SHARES
FROM COS_APPLICATIONS CA , COS_APPL_DETAILS CAD
WHERE APPL_TYPE =2
    AND CA.APPLICATION_ID = CAD.APPLICATION_ID
    AND CA.SERVICE_PRODUCT = 38002
    AND CAD.TRX_TYPE = 'INITIAL'
    AND CAD.TRX_UNIT = 143
    GROUP BY CA.MEMBER_ID
UNION ALL
SELECT CA.MEMBER_ID,
    SUM(CA.NUMBER_OF_SHARES) AS TRANSFERRED_SHARES, 
    0 AS PURCHASED_SHARES ,
    '-' AS DELETED_SHARES
FROM COS_APPLICATIONS CA , COS_APPL_DETAILS CAD
WHERE APPL_TYPE =5
   AND CA.APPLICATION_ID = CAD.APPLICATION_ID
   AND CA.SERVICE_PRODUCT = 38002
   AND CAD.TRX_TYPE = 'INITIAL'
   AND CAD.TRX_UNIT = 143 
   GROUP BY CA.MEMBER_ID
   ORDER BY CA.MEMBER_ID

Я получаю следующие результаты:

Моя проблема заключается в том, что когда участник передает и приобретает акции, я хочу, чтобы информация была в одном ряду, а не по отдельности.Например, участник с идентификатором 63 имеет 31 переданную акцию и 50 купленных. Мой запрос дает мне 2 строки: первая содержит 0 для переданных и 50 для купленных, а вторая - для 31 переданных и 0 для переданных.купить.Все, что я хочу, это то, что эта информация отображается в одной строке.

К сожалению, я пока не могу прикрепить изображение.

Примечание!Я выполняю этот запрос в SQL Server 2012.

Есть идеи?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Использовать агрегацию на одном уровне сверху

select MEMBER_ID,sum(TRANSFERRED_SHARES) as TRANSFERRED_SHARES ,sum(PURCHASED_SHARES) as URCHASED_SHARES
from 
(SELECT CA.MEMBER_ID,
    0 AS TRANSFERRED_SHARES ,
    SUM(CA.NUMBER_OF_SHARES) AS PURCHASED_SHARES, 
    '-' AS DELETED_SHARES
FROM COS_APPLICATIONS CA , COS_APPL_DETAILS CAD
WHERE APPL_TYPE =2
    AND CA.APPLICATION_ID = CAD.APPLICATION_ID
    AND CA.SERVICE_PRODUCT = 38002
    AND CAD.TRX_TYPE = 'INITIAL'
    AND CAD.TRX_UNIT = 143
    GROUP BY CA.MEMBER_ID
UNION ALL
SELECT CA.MEMBER_ID,
    SUM(CA.NUMBER_OF_SHARES) AS TRANSFERRED_SHARES, 
    0 AS PURCHASED_SHARES ,
    '-' AS DELETED_SHARES
FROM COS_APPLICATIONS CA , COS_APPL_DETAILS CAD
WHERE APPL_TYPE =5
   AND CA.APPLICATION_ID = CAD.APPLICATION_ID
   AND CA.SERVICE_PRODUCT = 38002
   AND CAD.TRX_TYPE = 'INITIAL'
   AND CAD.TRX_UNIT = 143 
   GROUP BY CA.MEMBER_ID
)X GROUP BY MEMBER_ID

ИЛИ использовать условное агрегирование

SELECT CA.MEMBER_ID,
        SUM(case when APPL_TYPE =5 then CA.NUMBER_OF_SHARES end) AS TRANSFERRED_SHARES ,
        SUM(case when APPL_TYPE =2 then CA.NUMBER_OF_SHARES end) AS PURCHASED_SHARES, 
        '-' AS DELETED_SHARES
    FROM COS_APPLICATIONS CA inner join COS_APPL_DETAILS CAD
    on CA.APPLICATION_ID = CAD.APPLICATION_ID
    where 
        CA.SERVICE_PRODUCT = 38002
        and CAD.TRX_TYPE = 'INITIAL'
        AND CAD.TRX_UNIT = 143
        GROUP BY CA.MEMBER_ID
0 голосов
/ 12 октября 2018

Как я уже сказал в своем комментарии, прекратите использовать неявные объединения.это уже не 1989 год: Отказ от вредных привычек: использование JOIN в старом стиле

Нет необходимости в двух разных SELECT утверждениях.Используйте правильные JOIN и IN для возврата данных и простое выражение CASE в вашем SUM:

SELECT CA.MEMBER_ID,
       SUM(CASE APPL_TYPE WHEN 5 THEN CA.NUMBER_OF_SHARES END) AS TRANSFERRED_SHARES, --APPL_TYPE is missing table alias
       SUM(CASE APPL_TYPE WHEN 2 THEN CA.NUMBER_OF_SHARES END) AS PURCHASED_SHARES, --APPL_TYPE is missing table alias
       '-' AS DELETED_SHARES
FROM COS_APPLICATIONS CA
     JOIN COS_APPL_DETAILS CAD ON CA.APPLICATION_ID = CAD.APPLICATION_ID
WHERE APPL_TYPE IN (2, 5) --APPL_TYPE is missing table alias
  AND CA.SERVICE_PRODUCT = 38002
  AND CAD.TRX_TYPE = 'INITIAL'
  AND CAD.TRX_UNIT = 143
GROUP BY CA.MEMBER_ID
ORDER BY CA.MEMBER_ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...