2016-06-30 3 views
0

Ich möchte Top 2 Artikel meist von jedem Kunden bestellt bekommen. Ich kann folgende Daten aus Verkaufstisch bekommendie Möglichkeit der Wiederholung von häufig auftretenden Werte Paar

----------------------------------------- 
|OrderAccount| Item  | OrderDate | 
|ABC   | Shoes #1 | 10.01.2016 | 
|ABC   | Shoes #2 | 10.01.2016 | 
|ABC   | Shoes #2 | 13.02.2016 | 
|ABC   | Shoes #1 | 12.12.2016 | 
|ABC   | Shoes #4 | 09.01.2016 | 
|RDD   | Shoes #1 | 01.21.2016 | 
|RDD   | Shoes #2 | 01.22.2016 | 
|RDD   | Shoes #1 | 03.01.2016 | 
|RDD   | Shoes #6 | 03.11.2016 | 
|RDD   | Shoes #1 | 03.21.2016 | 
----------------------------------------- 

Ich verwende die folgende Abfrage in earlier post erwähnt.

SELECT b.OrderAccount, b.Item 
FROM(
    SELECT *, RANK() OVER(PARTITION BY a.OrderAccount ORDER BY a.count_item DESC) AS RowRank 
    FROM(
     SELECT so.OrderAccount, so.Item, count(item) count_item 
     FROM SalesOrders so 
     GROUP BY so.OrderAccount, so.Item 
    ) a 
) b 
WHERE b.RowRank <= 2 

Ich mag würde mehr Einsicht aus den Daten bekommen: was ist die Chance, dass dieser Punkt in dem nächsten Kundenauftrag (dh in welchem ​​Prozentsatz des Kundenauftrages wird dieser Artikel für diesen Client angezeigt) erscheint kann ich diese Informationen von einer Abfrage erhalten?

Antwort

0

Dies ist, wie ich es tat:

SELECT a.OrderAccount, a.Item, a.Occurrence, b.SalesOrdersPerAccount, 
     CAST(CAST(a.Occurrence AS decimal)/CAST(b.SalesOrdersPerAccount AS decimal)*100 AS decimal(16,2)) AS Percentage 
FROM 
(
    SELECT so.OrderAccount, so.Item, COUNT(*) AS Occurrence FROM SalesOrders so 
    WHERE so.Item IS NOT NULL 
    GROUP BY so.OrderAccount, so.Item 
) a 

LEFT OUTER JOIN 
(
    SELECT so.OrderAccount, COUNT(*) AS SalesOrdersPerAccount FROM SalesOrders so 
    WHERE so.Item IS NOT NULL 
    GROUP so.OrderAccount 
) b ON a.OrderAccount = b.OrderAccount 

WHERE b.SalesOrdersPerAccount IS NOT NULL 
ORDER BY a.OrderAccount, Percentage DESC 
0

Jede Zeile scheint eine separate Reihenfolge zu sein, entsprechend den Daten in Ihrer Frage. Also, ich glaube, Sie tun können:

SELECT so.OrderAccount, so.Item, 
     (count_item * 1.0/num_orders) as proportion_of_orders 
FROM (SELECT so.OrderAccount, so.Item, count(item) as count_item, 
      SUM(COUNT(*)) OVER (PARTITION BY so.OrderAccount) as num_orders, 
      RANK() OVER (PARTITION BY so.OrderAccount ORDER BY COUNT(*) DESC) as rnk 
     FROM SalesOrders so 
     GROUP BY so.OrderAccount, so.Item 
    ) so 
WHERE rnk <= 2; 
+0

aber es ist auch möglich, für einen Verkauf, um mehr als 1 Zeile zu haben. Was sollen wir dann machen? – Afflatus

+0

@Afflatus. . . Sie sollten eine andere Frage mit entsprechenden Daten und gewünschten Ergebnissen stellen. –

Verwandte Themen