Reputation: 37
So I have a customer log-in screen with this information
StartDate | ClientID | cycleID |
---|---|---|
01-10-2022 | 101 | 100 |
01-10-2022 | 102 | 100 |
01-10-2022 | 103 | 100 |
01-10-2022 | 104 | 100 |
01-10-2022 | 105 | 100 |
01-11-2022 | 101 | 200 |
01-11-2022 | 102 | 200 |
01-11-2022 | 104 | 200 |
01-11-2022 | 106 | 200 |
01-11-2022 | 107 | 200 |
I want to make a reusable system where I can add a base CycleID(100) and a new CycleID(200) and get the count/list of clientID's that is returning and which are new.
I've looked into creating a CTE but was wondering if a UDF can be created in SQL
Upvotes: 0
Views: 31
Reputation: 49375
You can use conditonal aggregation on a join
SELECT SUM(CASE WHEN s2."ClientID" IS NOT NULL THEN 1 ELSE 0 END) repeat
,
SUM(CASE WHEN s2."ClientID" IS NULL THEN 1 ELSE 0 END) new_
FROM (SELECT * FROM tab1 WHERE "cycleID" = 200) s1
LEFT JOIN (SELECT * FROM tab1 WHERE "cycleID" = 100) s2
ON s1."ClientID" = s2."ClientID"
repeat | new_ |
---|---|
3 | 2 |
you can add Distinct, if you don't want to count the duplicates
SELECT SUM(CASE WHEN s2."ClientID" IS NOT NULL THEN 1 ELSE 0 END) repeat
,
SUM(CASE WHEN s2."ClientID" IS NULL THEN 1 ELSE 0 END) new_
FROM (SELECT DISTINCT "ClientID" FROM tab1 WHERE "cycleID" = 200) s1
LEFT JOIN (SELECT DISTINCT "ClientID" FROM tab1 WHERE "cycleID" = 100) s2
ON s1."ClientID" = s2."ClientID"
Upvotes: 1