2017-04-18 3 views
1

Ich muss die Gesamtzahl der Bestellung nach Kunden, Gesamtwert für alle diese Bestellungen, durchschnittlichen Bestellwert und E-Mail erhalten. Wo-von-Datum und Land habe ich in Where-Klausel erwähnt. Das ist mein Tisch. [Sell-to Customer No_] ist die Kunden-ID.Gesamtanzahl der Bestellungen, Gesamtbetrag und AOV

SELECT 

    [Sell-to Customer No_] 
    ,[Bill-to Name] 
    ,[Order Date] 
    ,[Amount] 
    ,[Original Order No_] 
    ,[Country] 
    ,[Email] 
    FROM [TBW_BI].[dbo].[Dreams$Internet Orders] 
    WHERE [Country]='RUSSIA' and 
    [order date] >= '2016-11-18T00:00:00.000' AND 
    [order date] <= '2017-04-10T00:00:00.000' 
+0

Hinweis: COUNT() ',' SUM() ',' AVG() '. –

+1

@ Giridhar, Was hast du versucht ..? – Mansoor

+0

Ich habe versucht, count() und sum(), aber ich bin neu in SQL Bit verwirrt. – jiroe

Antwort

0

Gehen wir durch das, was passiert in der SQL-Aggregation verwenden können. Angenommen, Sie verstehen den Verweis auf die Tabelle und was in der WHERE-Klausel passiert, werde ich nur über Aggregat Funktionen und GROUP BY sprechen.

Aggregate sind relativ einfache Funktionen, die vor der Gruppierung auf alle Zeilen in Ihrer Abfrage angewendet werden. Wenn Sie also eine Abfrage wie diese schreiben:

SELECT count(*) FROM MyTable 

Die Aggregatfunktion zählt alle Zeilen in der Tabelle. Summe, Durchschnitt, sind auch Aggregate. Wenn Sie Zählungen für verschiedene Teilmengen in der Tabelle anzeigen möchten, müssen Sie ein GROUP BY-Qualifikationsmerkmal angeben. Dadurch wird das Aggregat so geändert, dass die Anzahl der Zeilen für jede E-Mail gezählt wird.

SELECT email, count(*) FROM MyTable GROUP BY email 

Beachten Sie, dass wir explizit auf E-Mail in der SELECT, sowie in der GROUP BY verweisen müssen.

Also, um Ihre Frage zu beantworten, ich denke, Sie brauchen eine Abfrage wie folgt.

SELECT 
    [Email] 
    , COUNT(*)    AS order_count 
    , SUM([Amount])   AS total_amount 
    , AVG([Amount])   AS avg_amount 
FROM 
    [TBW_BI].[dbo].[Dreams$Internet Orders] 
WHERE 
    [Country]='RUSSIA' 
    AND [order date] >= '2016-11-18T00:00:00.000' 
    AND [order date] <= '2017-04-10T00:00:00.000' 
GROUP BY 
    [Email] 

Nur eine andere Sache zu wissen, wo vor der Aggregation angewandt wird, so kann es nicht filtern Ihre gruppierten Ergebnisse verwendet werden. Wenn Sie braucht etwas wie Filter zu tun, nach unten zu E-Mail, die mehr als zwei Aufträge hätte, würden Sie eine HAVING-Klausel bis zum Ende der Abfrage wie so hinzufügen:

... 
HAVING 
    count(*) >= 2 
0

Probieren Sie es

SELECT 

    [Sell-to Customer No_] 
    ,Count(*) 
    ,Sum([Amount]) 
    ,AVG([Amount]) 
    FROM [TBW_BI].[dbo].[Dreams$Internet Orders] 
    WHERE [Country]='RUSSIA' and 
    [order date] >= '2016-11-18T00:00:00.000' AND 
    [order date] <= '2017-04-10T00:00:00.000' 
group by [Sell-to Customer No_] 

und wenn Sie andere Spalte möchten Sie es bitte über den ersten bekommen, max, sum .... Funktionen auf Ihrem requierment

hängt ab, wenn jeder Kunde eine E-Mail hat in Ihren Gruppierungswerten können Sie Spalte wie diese hinzufügen

SELECT 

     [Sell-to Customer No_] 
     ,[Email] 
     ,Count(*) 
     ,Sum([Amount]) 
     ,AVG([Amount]) 
     FROM [TBW_BI].[dbo].[Dreams$Internet Orders] 
     WHERE [Country]='RUSSIA' and 
     [order date] >= '2016-11-18T00:00:00.000' AND 
     [order date] <= '2017-04-10T00:00:00.000' 
    group by [Sell-to Customer No_], [Email] 

wenn nein und Sie zum Beispiel zuerst anzeigen möchten E-Mail von Gruppierungs Werte Sie first_value wie diese

SELECT 

     [Sell-to Customer No_] 
     ,FIRST_VALUE([Email]) over (partition by [Sell-to Customer No_] order by [Sell-to Customer No_]) as Email 
     ,Count(*) 
     ,Sum([Amount]) 
     ,AVG([Amount]) 
     FROM [TBW_BI].[dbo].[Dreams$Internet Orders] 
     WHERE [Country]='RUSSIA' and 
     [order date] >= '2016-11-18T00:00:00.000' AND 
     [order date] <= '2017-04-10T00:00:00.000' 
    group by [Sell-to Customer No_] 
+0

Bitte geben Sie an, wie die Ergebnisse per E-Mail gesendet werden sollen. – jiroe

+0

, es funktioniert, aber ich muss nur E-Mail auch in den Ergebnissen erhalten. – jiroe

+0

geben Sie mir 1 Minute – Vecchiasignora