2016-07-22 5 views
0

In meiner Verkaufstabelle sind die täglichen Verkäufe eines bestimmten Mieters in einer Eigenschaft aufgeführt.SQL Query zu aufgeschlüsselten täglichen Verkäufen pro Monat

Mit diesem Code konnte ich den täglichen Verkauf von Mietern auflisten oder auswählen, der auf der Gruppierung von Property basiert.

SELECT date , location , SUM(a.gsc) Sales 
FROM SalesTable 
WHERE (date BETWEEN '01/01/2015' AND '12/31/2015') 
     and (location = 'Property1') 
GROUP BY location , date 
ORDER BY location, date 

Und das Ergebnis ist so etwas wie dieses

Date   Location  Sales 
01/01/2015 Property1 10,000 
01/02/2015 Property1 20,000 
. 
. 
. 
12/31/2015 Property1 15,000 

Was möchte ich erreichen, wie die endgültige Ausgabe des Ergebnisses in tabellarischer Form ist machen, die Tage Datum wie die erste Reihe und Monat als die Säulen. Bitte beachten Sie die Beispielausgabe zur weiteren Veranschaulichung.

Date January    February    
     Date Day Sales Date Day Sales 
1  1-Jan Fri 10,000 1-Feb Mon 9,000 
2  2-Jan Sat 20,000 2-Feb Tue 10,000 
3  .  . .  .  . . 
4  .  . .  .  . . 
5  .  . .  .  . . 
6  
7 
8 
. 
. 
. 
. 
. 
31 

Dies ist, was habe ich versucht,

SELECT date , location , SUM(a.gsc) Sales 
INTO #TempTable1 
FROM SalesTable 
WHERE (date BETWEEN '01/01/2015' AND '12/31/2015') 
      and (location = 'Property1') 
GROUP BY location , date 
ORDER BY location, date 



    SELECT months.number, tenants.locationd , tenants.location  
     ,(case when (t.DATE) = 1 then t.gsc end) as 'January' 
     ,(case when (t.DATE) = 2 then t.gsc end)) as 'February' 
     (case when year(t.DATE) = 3 then t.gsc end) as 'March' 

     FROM 
      (  
        SELECT Number 
        FROM master..spt_values 
        WHERE Type = 'P' and Number between 1 and 31 
      ) months 
      CROSS JOIN 
      (  --12 Month Name will be cross joined sa selected tenant/s 
        SELECT DISTINCT locationd , location 
        FROM #AMRDSR1 
      ) tenants  

    LEFT JOIN #AMRDSR1 t 
    ON months.number = datepart(day,t.date) and tenants.location = t.location 
    GROUP BY months.number, tenants.locationd , tenants.location , t.date, t.gsc 
    ORDER BY tenants.locationd , datepart(day,t.date) 

Ich habe verwendet Pivot vorgeschlagen worden, aber das ist mir ganz neu und schien sehr kompliziert zu sein, wenn es Möglichkeiten gibt, zu Tun Sie es einfach mit TSQL, viel besser.

Ich hoffe auf Ihre fachkundige Beratung.

Vielen Dank!

Antwort

1
-- assuming you only show one year of data at a time 

; with 
-- first get sales by date and the day of month and also month etc. 
data 
(
    SELECT [date] , SUM(a.gsc) AS Sales, 
     datepart(day, [date]) as [Day], 
     datepart(month, [date]) as [Month], 
     left(datename(weekday, [date]),3) as [WeekDay] 
    FROM SalesTable a 
    WHERE ([date] BETWEEN '01/01/2015' AND '12/31/2015') 
    and (location = 'Property1') 
    GROUP BY [date] 
) 
-- Now the "pivoting" using CASE WHEN .... with aggregate function 
SELECT [Day], 
     MAX(CASE WHEN [Month] = 1 THEN [date] END) as Date_Jan, 
     MAX(CASE WHEN [Month] = 1 THEN [WeekDay] END) as WeekDay_Jan, 
     SUM(CASE WHEN [Month] = 1 THEN [Sales] END) as Sales_Jan, 
     MAX(CASE WHEN [Month] = 2 THEN [date] END) as Date_Feb, 
     MAX(CASE WHEN [Month] = 2 THEN [WeekDay] END) as WeekDay_Feb, 
     SUM(CASE WHEN [Month] = 2 THEN [Sales] END) as Sales_Feb, 
     . . . . 
FROM data 
GROUP BY [Day] 
+0

Wird dies versuchen. Danke! @squirrel – rickyProgrammer

+0

arbeiten .. danke! – rickyProgrammer

+0

sind Sie herzlich willkommen – Squirrel