2016-04-20 6 views
1

Ich habe zwei Tabellen Product und Sales mit folgenden Struktur:SQL Server: alle Produkte und Verkaufsdaten zu zählen

Product Tabelle:

ProductID | Name 
    1 | Product 1 
    2 | Product 2 
    3 | Product 3 

Sales Tabelle:

SalesID | Time  | ProductID | Sales 
     01  | 201601 |  1  | 10 
     02  | 201602 |  1  | 11 
     03  | 201603 |  1  | 13 
     04  | 201604 |  2  | 1 
     05  | 201601 |  3  | 12 
     06  | 201602 |  2  | 5 
     06  | 201608 |  3  | 3 
     06  | 201609 |  3  | 4 

würde ich mag diese Ansicht bekommen:

ProductName | Time | counter | Sales 
     Product 1 | 201601 |  0  | 10 
     Product 1 | 201602 |  1  | 11 
     Product 1 | 201603 |  2  | 13 
     Product 2 | 201604 |  0  | 1 
     Product 3 | 201601 |  0  | 12 
     Product 2 | 201602 |  1  | 5 
     Product 3 | 201608 |  1  | 3 
     Product 3 | 201609 |  2  | 4 

Also im Grunde ist mein Zähler nur eine Spalte, die mir die ersten Verkäufe zeigt, je nach Produkt und Zeit. Mein Zähler muss mit 0 beginnen und zählen, wie viele Verkäufe ich für dieses Produkt habe.

Zum Beispiel für Artikel 1 der erste ist der Vertrieb in 201.601 die zweite in 201.602 usw.

für jeden Vertriebs je nach Produkt muss ich tun, um: Counter = Zähler + 1 und wenn ich ein neues Produkt Mein Zähler muss wieder mit 0 beginnen.

Ich kann dies mit gespeicherten Prozeduren tun, aber wenn es möglich ist, möchte ich eine Abfrage für diesen Teil erstellen.

Danke für Ihre Hilfe.

+0

Ich glaube, Sie durch productid Partition sollte dann subtrahieren 1 aus der Reihe gebildet. – KumarHarsh

Antwort

2

Sie suchen row_number():

select p.productname, s.time, 
     row_number() over (partition by s.productid order by time) as counter, 
     s.sales 
from sales s join 
    product p 
    on s.productid = p.productid 
order by time; 
4

Als Kumar wies darauf hin, Sie Zeilennummer mit Partitionen verwenden können, wenn es einfach sequentiell ist:

SELECT 
    p.Name, 
    s.Time, 
    (ROW_NUMBER() OVER (PARTITION BY s.ProductId ORDER BY s.ProductId, s.Time) - 1) AS Counter, 
    s.Sales 
FROM [Sales] s 
LEFT JOIN [Product] p ON p.ProductId = s.ProductId 
Verwandte Themen