简体   繁体   中英

How to add conditions to multiple count() functions in a single select statement

Okay, this is what I've tried:

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]

I get the following error:

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

Clearly the grouping is missing for the count() functions, I just don't know where to add it or if it is even possible to do so this way.

I've also tried to do it in a more verbose way:

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

But I wan't to merge the two BUYERS attribue, to get all buyers in one column. I guess I should just use UNION with this solution, but that would made me do more renames and manual selects I guess.

So I wonder if I could do it somehow like the first, more concise way.

You can use conditional aggregation putting the CASE as an argument to 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];

Note that SELECT DISTINCT is almost never appropriate with GROUP BY .

@Gordon Linoff is correct.But I am going to little bit change of @Gordon Linoff. Assuming that there's may be missing FRANCHISE 'OWN' OR '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];

I am not something clear that . Do u want the total count of Franchise? According my assuming code will be like.....

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];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM