Reputation: 223
I'm currently trying to count how many times an article's category appears in a ticket table.
The problem is that the categories have sub-categories and they're all listed as a single string in the table ("Cat1 > Subcat1", "Cat1 > Subcat2", etc).
What I've done so far is managed to get all the distinct categories listed, but I want to strip any subcategories from the results and combine any duplicates.
As an example, I have the following categories and counts:
Category | 13
Category > Subcat1 | 14
Category > Subcat2 | 3
What I want to see is:
Category | 30
So far I've managed to strip the subcategories, but the actual row is basically duplicated with different values:
Category | 13
Category | 14 Category | 3
Here is my current code:
SELECT
CASE
WHEN CHARINDEX(' >',SUBSTRING(KM2.GENERATEDCATS,16,20))=0
THEN SUBSTRING(KM2.GENERATEDCATS,16,20)
ELSE SUBSTRING(SUBSTRING(KM2.GENERATEDCATS,16,20),1,CHARINDEX(' >',SUBSTRING(KM2.GENERATEDCATS,16,20)))
END AS "Final",
COUNT(KM2.GENERATEDCATS) AS "Count"
FROM INCIDENTSM1 AS SD LEFT JOIN KMDOCUMENTM1 AS KM1 ON SD.CBA_KPF_ID=KM1.ID
LEFT JOIN KMDOCUMENTA2 AS KM2 ON KM1.ID=KM2.ID
GROUP BY KM2.GENERATEDCATS
ORDER BY Count DESC
Legend:
INCIDENTSM1 - Ticket table
KMDOCUMENTM1 - Article table
KMDOCUMENTA2 - Categories (separate from main table)
GENERATEDCATS - Category column
Is it possible to combine all those 'Category' rows into one with a total count?
Upvotes: 2
Views: 43
Reputation: 72165
Try to GROUP BY
the extracted category name:
SELECT CASE
WHEN CHARINDEX(' >',SUBSTRING(KM2.GENERATEDCATS,16,20))=0
THEN SUBSTRING(KM2.GENERATEDCATS,16,20)
ELSE SUBSTRING(SUBSTRING(KM2.GENERATEDCATS,16,20),1,
CHARINDEX(' >',SUBSTRING(KM2.GENERATEDCATS,16,20)))
END AS "Final",
COUNT(KM2.GENERATEDCATS) AS "Count"
FROM INCIDENTSM1 AS SD
LEFT JOIN KMDOCUMENTM1 AS KM1 ON SD.CBA_KPF_ID=KM1.ID
LEFT JOIN KMDOCUMENTA2 AS KM2 ON KM1.ID=KM2.ID
GROUP BY CASE
WHEN CHARINDEX(' >',SUBSTRING(KM2.GENERATEDCATS,16,20))=0
THEN SUBSTRING(KM2.GENERATEDCATS,16,20)
ELSE SUBSTRING(SUBSTRING(KM2.GENERATEDCATS,16,20),1,CHARINDEX(' >',
SUBSTRING(KM2.GENERATEDCATS,16,20)))
END
ORDER BY Count DESC
Upvotes: 3