2017-07-21 3 views
0

Ein Kunde hat Bestellungen und jede Bestellung von einem Typ 1 oder Typ 2. Ich möchte zählen, wie oft jeder Typ aufgetreten ist vor jeder Bestellung.Anzahl der Bestellungen eines bestimmten Typs vor jeder Bestellung

Zum Beispiel für einen Kunden:

customer | orders| Type 
---------+------------- 
customerA| Order1| 1 
customerA| Order2| 1 
CustomerA| Order3| 2 
customerA| Order1| 1 
customerA| Order2| 2 
customerA| Order3| 2 
CustomerA| Order1| 1 
customerA| Order2| 2 

Erforderliche Ergebnisse:

customer | orders| Type| Nr_typ1| Nr_typ2 
    ---------+-------+-----+--------+------- 
    customerA| Order1| 1 | 0 | 0 
    customerA| Order2| 1 | 1 | 0 
    CustomerA| Order3| 2 | 2 | 0 
    customerA| Order1| 1 | 2 | 1 
    customerA| Order2| 2 | 3 | 1 
    customerA| Order3| 2 | 3 | 2 
    CustomerA| Order1| 1 | 3 | 3 
    customerA| Order2| 2 | 4 | 3 

, was ich versuchte, war:

select t.customer, t.orders, t.type, sum(t.type1), sum(t.type2) from 
(select customer, orders, type, 
case type = 1 then 1 else 0 end as type1, 
case type = 2 then 1 else 0 end as type2 
from table customer_orders) t group by customer, orders, type 

würden Anregungen Higgly geschätzt! Danke

Antwort

1

Ich glaube, dass HANA windowed aggregates unterstützt. Das folgende Skript wurde auf SQL Server getestet, aber ich glaube, die gleiche Abfrage auf HANA funktionieren sollte:

declare @t table(customer varchar(20) not null, orders varchar(10) not null, Type int not null) 
insert into @t(customer,orders,Type) values 
('customerA','Order1',1), 
('customerA','Order2',1), 
('CustomerA','Order3',2), 
('customerA','Order1',1), 
('customerA','Order2',2), 
('customerA','Order3',2), 
('CustomerA','Order1',1), 
('customerA','Order2',2) 

select 
    *, 
    SUM(CASE WHEN Type=1 THEN 1 ELSE 0 END) OVER 
    (PARTITION BY customer 
    ORDER BY orders 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 
    CASE WHEN Type=1 THEN 1 ELSE 0 END as TotalType1, 
    SUM(CASE WHEN Type=2 THEN 1 ELSE 0 END) OVER 
    (PARTITION BY customer 
    ORDER BY orders 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 
    CASE WHEN Type=2 THEN 1 ELSE 0 END as TotalType1 
from @t 

Ergebnisse:

customer    orders  Type  TotalType1 TotalType1 
-------------------- ---------- ----------- ----------- ----------- 
customerA   Order1  1   0   0 
customerA   Order1  1   1   0 
CustomerA   Order1  1   2   0 
customerA   Order2  2   3   0 
customerA   Order2  2   3   1 
customerA   Order2  1   3   2 
CustomerA   Order3  2   4   2 
customerA   Order3  2   4   3 

Hoffentlich werden die Definitionen der Fenster sind relativ leicht auseinander zu necken - niemand beschuldigte SQL, knapp zu sein.

(Ich bekomme nicht die genauen Ergebnisse in der Frage angefordert, aber das ist, weil der Beispieldatensatz keine passende Spalte enthält, um in die ORDER BY -Klausel zu setzen, so dass "vorher" wohl definiert ist zur Zeit mit orders, aber das ist nicht einzigartig)

+0

Damien 'REIHEN ZWISCHEN UNBOUNDED PRECEDING UND CURRENT REIHE 'Ich habe keine Ahnung, dass das existiert. Kannst du mich bitte Referenzhandbuch dazu beziehen? Vielen Dank! – Sai

+0

@Sai - bereits aus der Antwort im ersten Satz verknüpft. Leider ist es eine ziemlich lange Seite, aber wenn Sie nach "UNBOUNDED" suchen, sollte Sie ungefähr den richtigen Teil des Dokuments erreichen. –

+0

Vielen Dank. es ist sehr interessant. Hav hat heute etwas sehr Neues gelernt. – Sai

0

Sie können mit WHILE Schleife in SQL wie unten verwenden. (# Bestell ist meine Bestellung Tisch, können Sie es zu Ihrem aktuellen Tabelle zu ändern)

erstellen Tabelle zu speichern Ergebnis:

CREATE TABLE #res 
    (customer varchar(100), 
    orders varchar(100), 
    [type] int, 
    Nr_typ1 int, 
    Nr_typ2 int) 

einige Variablen deklarieren und Cursor für WHILE Schleife:

DECLARE @Customer varchar(100), @Order varchar(100), @Type int, @nr_type1 int = 0, @nr_type2 int = 0 

DECLARE order_cursor CURSOR FOR 
SELECT customer, orders, [type] 
FROM #orders 

Schleife über den Tisch:

OPEN order_cursor 
FETCH NEXT FROM order_cursor INTO @Customer, @Order, @Type 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    INSERT INTO #res 
    VALUES(@Customer, @Order, @Type, @nr_type1, @nr_type2)  

    IF @Type = 1 
     SET @nr_type1 = @nr_type1 + 1 
    ELSE 
     SET @nr_type2 = @nr_type2 + 1 

    FETCH NEXT FROM order_cursor INTO @Customer, @Order, @Type 
END 

drucken Ergebnis:

SELECT * FROM #res 

Schließen Cursor nach Gebrauch:

CLOSE order_cursor 
DEALLOCATE order_cursor 
GO 

Ihr Ergebnis Tabelle löschen, wenn Sie nicht mehr benötigen:

DROP TABLE #res 
Verwandte Themen