2016-03-19 7 views
3

Ich habe eine Kunde Tabelle, in der eine neue Zeile eingefügt wird, wenn eine Kundenanmeldung auftritt.Tägliche zählt für Ereignisse, die nicht jeden Tag passieren

Problem

Ich möchte für einen bestimmten Zeitraum die Gesamtzahl der Anmeldungen pro Tag wissen.

Zum Beispiel findet die Gesamtzahl der Anmeldungen pro Tag von 2015.07.01 bis 2015-07-10

Kundentabelle Beispieldaten [relevante Spalten dargestellt]

customerid username created 
1    mrbean  2015-06-01 
2    tom   2015-07-01 
3    jerry  2015-07-01 
4    bond  2015-07-02 
5    superman 2015-07-10 
6    tintin  2015-08-01 
7    batman  2015-08-01 
8    joker  2015-08-01 

erforderliche Ausgabe

created  signup 
2015-07-01 2 
2015-07-02 1 
2015-07-03 0 
2015-07-04 0 
2015-07-05 0 
2015-07-06 0 
2015-07-07 0 
2015-07-08 0 
2015-07-09 0 
2015-07-10 1 

Abfrage verwendet

SELECT 
    DATE(created) AS created, COUNT(1) AS signup 
FROM 
    customer 
WHERE 
    DATE(created) BETWEEN '2015-07-01' AND '2015-07-10' 
GROUP BY DATE(created) 
ORDER BY DATE(created) 

ich die folgende Ausgabe bin immer:

created  signup 
2015-07-01 2 
2015-07-02 1 
2015-07-10 1 

Welche Änderung sollte ich in der Abfrage, um die erforderliche Ausgabe zu bekommen?

+0

Ich denke, Sie müssen nur ändern Sie Ihren Abfrage-Code COUNT (erstellt) als SignUp –

+0

@DavyC immer noch das gleiche Ergebnis. – yusufshakeel

+0

Mögliches Duplikat von http://stackoverflow.com/q/2157282/1920758 – mnv

Antwort

2

Sie suchen nach einer Möglichkeit, alle aufgelisteten Tage zu erhalten, auch die Tage, die nicht in Ihrer customer Tabelle dargestellt sind. Dies ist ein notorischer Schmerz im Nacken in SQL. Das liegt daran, dass SQL in seiner reinen Form das Konzept einer zusammenhängenden Sequenz von irgendetwas ... Kardinalzahlen, Tagen, was auch immer fehlt.

So müssen Sie eine Tabelle mit einer Quelle von zusammenhängenden Kardinalzahlen oder Daten oder etwas einführen, und dann LINKS verbinden Sie Ihre vorhandenen Daten zu dieser Tabelle.

Es gibt ein paar Möglichkeiten, dies zu tun. Eine ist, sich einen calendar Tisch mit einer Reihe für jeden Tag im gegenwärtigen Jahrzehnt oder Jahrhundert oder was auch immer zu schaffen, dann schließt euch ihm an. (Diese Tabelle wird nicht sehr groß sein im Vergleich zu der Fähigkeit einer modernen Datenbank.

Angenommen, Sie die Tabelle, und es hat eine Spalte date benannt. Dann würden Sie dies tun.

SELECT calendar.date AS created, 
     ISNULL(a.customer_count, 0) AS customer_count 
    FROM calendar 
    LEFT JOIN ( 
      SELECT COUNT(*) AS customer_count, 
        DATE(created) AS created 
       FROM customer 
      GROUP BY DATE(created) 
     ) a ON calendar.date = a.created 
    WHERE calendar.date BETWEEN start AND finish 
    ORDER BY calendar.date 

Hinweis ein paar Dinge. Erstens, die LEFT JOIN aus der Kalender-Tabelle Ihres Datensatz. Wenn Sie ein gewöhnlichen JOIN die fehlenden Daten in der Datensatz verwenden die Zeilen aus dem Kalender zu unterdrücken.

Zweitens, die ISNULL in die Toplevel SELECT um die fehlenden, null, Werte fr zu drehen om dein Dataset in Null-Werte.

Jetzt fragen Sie, wo bekomme ich den Kalendertisch? Ich empfehle respektvoll, dass Sie nachsehen, und stellen Sie eine andere Frage, wenn Sie es nicht herausfinden können.

Ich habe einen kleinen Aufsatz dazu geschrieben, den Sie hier finden können. http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/

0
DECLARE @MinDate DATE = '2015-07-01', 
     @MaxDate DATE = '2015-07-10'; 

Create Table tblTempDates 
(created date, signup int) 

insert into tblTempDates 
SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) 
     Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate), 0 As Signup 
FROM sys.all_objects a 
     CROSS JOIN sys.all_objects b; 

Create Table tblTempQueryDates 
(created date, signup int) 

INSERT INTO tblTempQueryDates 
SELECT 
    created AS created, COUNT(scandate) AS signup 
FROM 
    customer 
WHERE 
    created BETWEEN @MinDate AND @MaxDate 
GROUP BY created 

UPDATE tblTempDates 
SET tblTempDates.signup = tblTempQueryDates.signup    
FROM   tblTempDates INNER JOIN 
         tblTempQueryDates ON tblTempDates.created = tblTempQueryDates.created 

select * from tblTempDates 
order by created 

Drop Table tblTempDates 
Drop Table tblTempQueryDates 

Nicht schön, aber es gibt Ihnen, was Sie wollen.

1

Blick here

mit Kalender teble erstellen und es in der Abfrage verbinden.

Verwandte Themen