2016-06-27 3 views
0

Ich versuche eine Count-Anweisung zu machen, zeigen Sie, wie viele spezifische Versionen jede Kategorie hat. Das Problem ist, wenn eine Version über eins ist, wird das Ergebnis gelöscht.Count() Keeps Nullstellen

Wenn zum Beispiel drei von einer Kategorie mit zwei von ihnen eine Version haben, während die andere eine andere Version hat, wird die Zählung der Version mit zwei Instanzen '0' statt '2' in den Ergebnissen zeigen. Wenn die Kategorie nur eine Version hat, funktioniert sie perfekt. Nur wenn mehr als eine Instanz einer Version vorhanden ist, wird 0 ausgegeben.

Kann jemand reparieren? Ich gehe davon aus, dass es in meinem Fall Aussagen sind, aber ich bin mir nicht sicher.

Mein Code ist unten.

select Category, Count(Case When Version = 'Offer' then 1 end) as Offers, Count(Case When Version = 'No Offer' then 1 end) as [No Offers] from (
Select *, ROW_NUMBER() over (Partition By Category order by version) as GroupOrder, DENSE_RANK() over (order by category) as GroupNo From Input 
) A 
where groupno in 
(
select groupno from (
Select *, ROW_NUMBER() over (Partition By Category order by version) as GroupOrder, DENSE_RANK() over (order by category) as GroupNo From Input 
) A where GroupOrder > 1) and ID not in 
(
select ID from 
(
Select *, ROW_NUMBER() over (Partition By Category, Version order by version) as GroupOrder, DENSE_RANK() over (order by category, Version) as GroupNo From Input 
) A 
where groupno in 
(
select groupno from 
(
Select *, ROW_NUMBER() over (Partition By Category, Version order by version) as GroupOrder, DENSE_RANK() over (order by category, Version) as GroupNo From Input 
) A where GroupOrder > 1) 
) 
group by Category 
order by Category 
+1

wenn Sie zählen nur 1'en Sie es ändern können, um Summen- und sehen, wenn Sie gleiche Ergebnis .. 'SUM (CASE WHEN Version = 'Angebot' THEN 1 END) AS Offers' Version in einem reservierten Wort Auch wenn Sie Klammern verwenden möchten, wie [Version] – JamieD77

+0

Die Verwendung von SUMME führt zum gleichen Ergebnis, leider –

+0

Ich habe die Ursache des Problems gefunden. Wenn eine Kategorie mehrere Instanzen einer Version zurückgibt, wird sie aus den von der Abfrage generierten Ergebnissen entfernt. Es funktioniert gut, wenn jede Kategorie nur eine Version hat, aber nicht, wenn es mehr als eine gibt. –

Antwort

0

Ich habe viel Erfolg hatte CTE's für diese Art von Problem verwenden. Dies kann Ihnen die Antwort geben, nach der Sie suchen.

;WITH CTE 
    AS (SELECT Category, 
      CASE WHEN [Version] = 'Offer' THEN 1 
        ELSE 0 
       END AS Offers, 
      CASE WHEN [Version] = 'No Offer' THEN 1 
       ELSE 0 
       END AS [No Offers] 
     FROM 
      (SELECT *, ROW_NUMBER() OVER (PARTITION BY Category ORDER BY version) AS GroupOrder 
        , DENSE_RANK() OVER (ORDER BY category) AS GroupNo 
      FROM Input) A 
     WHERE GroupNo IN 
      (SELECT GroupNo 
      FROM (SELECT * 
         , ROW_NUMBER() OVER (PARTITION BY Category ORDER BY version) AS GroupOrder 
         , DENSE_RANK() OVER (ORDER BY category) AS GroupNo 
        FROM Input) A 
      WHERE GroupOrder > 1) 
       AND ID NOT IN 
       (SELECT ID 
        FROM 
        (SELECT * 
          , ROW_NUMBER() OVER (PARTITION BY Category, Version ORDER BY version) AS GroupOrder 
          , DENSE_RANK() OVER (ORDER BY category, Version) AS GroupNo 
         FROM Input) A 
        WHERE GroupNo IN 
        (SELECT GroupNo 
         FROM 
         (SELECT * 
           , ROW_NUMBER() OVER (PARTITION BY Category, Version ORDER BY version) AS GroupOrder 
           , DENSE_RANK() OVER (ORDER BY category, Version) AS GroupNo 
          FROM Input) A 
         WHERE GroupOrder > 1))) 
    SELECT Category, 
     SUM(Offers) AS Offers, 
     SUM([No Offers]) AS Offers 
    FROM [CTE] 
    GROUP BY Category 
    ORDER BY Category 
+0

Es entstehen immernoch Nullen, wenn eine Instanz größer als 1 auftritt. Ich weiß nicht genau, warum –