2017-06-12 4 views
0

Meine Daten sieht wie folgt aus:Zählen Distinct Monate mit mehreren Datensätzen pro Monat

Code Date 
123  1/2/2016 
123  1/4/2016 
123  1/4/2016 
123  2/5/2016 
456  1/2/2016 
456  1/3/2016 
456  2/7/2016 
789  1/7/2016 
789  1/8/2016 
789  3/7/2016 
789  3/15/2016 

ich für eine bestimmte Anzahl der Monate nach dem Code gruppiert suchen.

So würden die Ergebnisse in etwa so aussehen

Code  Jan2016  Feb2016  Mar2016 
123   1   1   0 
456   1   1   0 
789   1   0   1 

Ich fühle mich wie ich meinen Code werden overcomplicating kann.

Bisher habe ich

SELECT 
    p.code 
    ,SUM(CASE WHEN p.date BETWEEN '11/1/2010' AND '11/30/2010' 
    THEN 1 ELSE 0 END) AS 'Nov2010' 
    FROM table 
    Group By p.code 

Aber das ist in allen Datensätzen aus Nov2010 ziehen, wenn ich muss nur wissen, ob diese

existiert
+0

Welche [DBMS] (https://en.wikipedia.org/wiki/DBMS) verwenden Sie? Postgres? Orakel? –

Antwort

0

Sie können nur Ihre Aggregatfunktion ändern. Verwenden Sie MAX anstelle von SUM.

SELECT 
    p.code 
    ,MAX(CASE WHEN p.date BETWEEN '11/1/2010' AND '11/30/2010' 
    THEN 1 ELSE 0 END) AS 'Nov2010' 
FROM table 
Group By p.code 
+0

Wird MAX verwendet, wenn es innerhalb des Monats ein doppeltes MAX-Datum gibt? – baineschile

+0

@baineschile der 'MAX' wird auf den' CASE' angewendet, nicht auf die Datumsspalte. Die MAX-Funktion gibt 1 zurück, wenn es mindestens eine Zeile innerhalb dieses Monats gibt, andernfalls 0. Ist es das was du willst? – danielsepulvedab

+0

Das ist was ich will. Aber wenn zwei Datensätze mit demselben maximalen Datum (dh 12/13/2016) nicht doppelt gezählt werden? – baineschile

0

in SQL Server Sie eine Pivot-Tabelle verwenden können, bisschen chaotisch, aber so etwas wie dies funktionieren wird, Daten Beispiel:

declare @table table (code int, date date) 
insert into @table values 
(123, '1/2/2016'), 
(123, '1/4/2016'), 
(123, '1/4/2016'), 
(123, '2/5/2016'), 
(456, '1/2/2016'), 
(456, '1/3/2016'), 
(456, '2/7/2016'), 
(789, '1/7/2016'), 
(789, '1/8/2016'), 
(789, '3/7/2016'), 
(789, '3/15/2016') 

dann eine Pivot-Tabelle mit:

with cte (code) as (select distinct code from @table) 

select 
    c1.code, 
    ISNULL(months.[1],0) as 'Jan 2016', 
    ISNULL(months.[2],0) as 'Feb 2016', 
    ISNULL(months.[3],0) as 'Mar 2016' 
from 
    (
    select 
    c.code, 
    count(distinct t.code) as [ID], 
    month(date) as [month] 
    from @table t 
    join cte c on t.code = c.code 
    group by c.code, month(date) 
    ) P 
pivot 
    (
    sum([ID]) 
    for [month] IN ("1","2","3")--,"4","5","6","7","8","9","10","11","12") 
    ) as months 
    join cte c1 on months.code = c1.code 

wird geben Sie die folgenden Ergebnisse:

code Jan 2016 Feb 2016 Mar 2016 
123   1   1   0 
456   1   1   0 
789   1   0   1 

Wenn Sie den Kommentar nach dem dritten Monat herausnehmen, können Sie ihn für den Rest des Jahres tun.

+0

Ich schätze das Feedback, aber das wird nicht funktionieren. Ich habe ein paar Millionen Zeilen zu sehen. Ich gab nur ein einfaches Beispiel für den Kontext. – baineschile

+0

@Baineschile es wird die gleiche Logik mit einer beliebigen Anzahl von Zeilen, ich zeigte nur die Beispieldaten, wie ich temporäre Tabellen in der Abfrage verwendet – dbajtr

+0

nur ändern 'von @Table' in der Abfrage zu Ihrem Tabellennamen, nehmen Sie den Kommentar aus die Pivot-Tabelle, um den Rest der Monate zu erhalten und sie in die Auswahl aufzunehmen – dbajtr

Verwandte Themen