Fondamentalmente sto cercando di ottenere un conteggio distinto all'interno di questo risultato a cubetti. Ma sfortunatamente non puoi usare Count (distinto (Campo)) con cubo e rollup (as stated here)SQL Sever Ottenere un conteggio distinto usando "Raggruppa per ... con cubo"
Ecco come appare il dato. (Questo è solo un semplice esempio mi aspetto i duplicati nei dati)
Category1 Category2 ItemId
a b 1
a b 1
a a 1
a a 2
a c 1
a b 2
a b 3
a c 2
a a 1
a a 3
a c 4
Ecco quello che mi piacerebbe fare, ma non funziona.
SELECT
Category1,
Category2,
Count(Distinct(ItemId))
FROM ItemList IL
GROUP BY
Category1,
Category2
WITH CUBE
so che posso fare un sub selezionare come questo per ottenere i risultati che voglio:
SELECT
*,
(SELECT
Count(Distinct(ItemId))
FROM ItemList IL2
WHERE
(Q1.Category1 IS NULL OR Q1.Category1 IS NOT NULL AND Q1.Category1 = IL2.Category1)
AND
(Q1.Category2 IS NULL OR Q1.Category2 IS NOT NULL AND Q1.Category2 = IL2.Category2))
AS DistinctCountOfItems
FROM (SELECT
Category1,
Category2
FROM ItemList IL
GROUP BY
Category1,
Category2
WITH CUBE) Q1
Ma questo corre lento quando il set di risultati è grande a causa della sub-select. C'è un altro modo per ottenere un Distinct Count da un risultato a cubetti?
questo è il risultato che voglio vedere
Category1 Category2 DistinctCountOfItems
a a 3
a b 3
a c 3
a NULL 4
NULL NULL 4
NULL a 3
NULL b 3
NULL c 3
@ chezy525 .... Bel approccio ... mi piace. È sicuramente più efficiente dei sindacati. ancora un po 'più disordinato di quanto mi piaccia ma funziona. –
Grazie! È stato un diversivo divertente per il mio venerdì! Penso che ogni soluzione sarà "più disordinata di quanto dovrebbe essere" senza il supporto aggregato distinto ... – chezy525
La tua ultima opzione è la stessa alla fine alla fine, è la più elegante, e sta colpendo i tavoli il minor numero volte per ottenere il risultato. Per quanto posso dire dai miei piani di esecuzione, un indice su Category1, Category2, ItemID farebbe la query il più velocemente possibile. – cairnz