Как добавить условия для нескольких функций count () в одном операторе select - PullRequest
0 голосов
/ 28 июня 2019

Хорошо, это то, что я пробовал:

SELECT 
    DISTINCT [TRANSPORT ADDRESS] AS BUYERS, 
    CASE WHEN FRANCHISE = 'FRANCHISE' THEN COUNT(DISTINCT ORDERID) END AS [FRANCHISE],
    CASE WHEN FRANCHISE = 'OWN' THEN COUNT(DISTINCT ORDERID) END AS [OWN]
FROM JOINED
GROUP BY [TRANSPORT ADDRESS]
ORDER BY [TRANSPORT ADDRESS]

Я получаю следующую ошибку:

Column 'JOINED.Franchise' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

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

Я также пытался сделать это более многословно:

SELECT T1.BUYERS, [FRANCHISE SALES], [OWN SALES] 
FROM
    (SELECT DISTINCT [TRANSPORT ADDRESS] AS BUYERS, COUNT(DISTINCT ORDERID) AS [FRANCHISE SALES]
    FROM JOINED
    WHERE FRANCHISE = 'FRANCHISE'
    GROUP BY TRANSPORT ADDRESS]) 
T1
FULL OUTER JOIN
    (SELECT DISTINCT [TRANSPORT ADDRESS] AS BUYERS, COUNT(DISTINCT ORDERID) AS [OWN SALES]
    FROM JOINED
    WHERE FRANCHISE = 'OWN'
    GROUP BY [TRANSPORT ADDRESS]) 
T2
ON T1.BUYERS = T2.BUYERS
ORDER BY T1.BUYERS

Но я не хочу объединять два атрибута ПОКУПАТЕЛЕЙ, чтобы собрать всех покупателей в одном столбце.Полагаю, мне следует использовать UNION с этим решением, но это заставило бы меня делать больше переименований и ручного выбора, я думаю.

Так что мне интересно, смогу ли я сделать это как-нибудь как первый, более краткий способ.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Вы можете использовать условное агрегирование, указав CASE в качестве аргумента COUNT():

SELECT [TRANSPORT ADDRESS] AS BUYERS, 
       COUNT(DISTINCT CASE WHEN FRANCHISE = 'FRANCHISE' THEN ORDERID END) AS [FRANCHISE],
       COUNT(DISTINCT CASE WHEN FRANCHISE = 'OWN' THEN ORDERID END) AS [OWN]
FROM JOINED
GROUP BY [TRANSPORT ADDRESS]
ORDER BY [TRANSPORT ADDRESS];

Обратите внимание, что SELECT DISTINCT почти никогда не подходит для GROUP BY.

0 голосов
/ 28 июня 2019

@ Гордон Линофф прав. Но я собираюсь немного изменить @ Гордон Линофф. Предполагая, что может отсутствовать FRANCHISE «OWN» ИЛИ «FRANCHISE»

SELECT [TRANSPORT ADDRESS] AS BUYERS, 
           COUNT(DISTINCT CASE WHEN FRANCHISE = 'FRANCHISE' THEN ORDERID Else 0 END) AS [FRANCHISE],
           COUNT(DISTINCT CASE WHEN FRANCHISE = 'OWN' THEN ORDERID Else 0 END) AS [OWN]
    FROM JOINED
    GROUP BY [TRANSPORT ADDRESS]
    ORDER BY [TRANSPORT ADDRESS];

Мне не ясно, что это. Вы хотите общее количество франшиз? В соответствии с моим предположением код будет как .....

SELECT [TRANSPORT ADDRESS] AS BUYERS, 
               COUNT(DISTINCT CASE WHEN FRANCHISE = 'FRANCHISE' THEN ORDERID Else 0 END) AS [FRANCHISE],
               COUNT(DISTINCT CASE WHEN FRANCHISE = 'OWN' THEN ORDERID Else 0 END) AS [OWN],(select count(ORDERID ) from JOINED) as AllFRANCHISE 
        FROM JOINED
        GROUP BY [TRANSPORT ADDRESS]
        ORDER BY [TRANSPORT ADDRESS];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...