2016-06-01 5 views
1

Ich versuche, die Anzahl der Produkte/Anzahl der Systeme für jedes Geschäft zu finden. Die Tabellen sehen wie folgt aus:Wie erhalten Sie die ursprüngliche Anzahl nach dem Verbinden von Tabellen?

Store 
Id 
100 
200 

Customer 
Id  | dealerId 
1  | 100 
2  | 200 

System 
Id | CustomerId 
20 | 2 
30 | 2 
40 | 2 
50 | 1 

Product 
Id | SystemId 
1000 | 20 
2000 | 50 

ich versuche zu bekommen:

storeId | Number of systems | number of products | average 
100  |   1  |   1   |  1/1 
200  |   3  |   1   |  1/3  

ich diese Abfrage geschrieben haben. Ich bekomme die richtige Anzahl an Produkten, aber die Anzahl der Systeme ist durcheinander, weil ich mich den Tabellen anschließe. Gibt es eine Möglichkeit, die Gesamtzahl der Systeme für jedes Geschäft zu erhalten?

SELECT 
    s.Id as Store, 
    COUNT(Distinct SystemsIden) as NumOfSystems, 
    COUNT(distinct ProductIden) as NumOfProduct, 
    CAST(COUNT(distinct ProductIden)as float)/CAST(COUNT(Distinct SystemsIden) as 
    float) as average 
FROM 
Store s 
    INNER JOIN 
    (
    Select systemsiden,CustomerIden,ProductIden, Customer.StoreId as 
    storeiden from 
(
    select Product.ID as ProductIden, System.Id as systemsiden, System.customerId as CustomerIden from product join Ssystem On System.Id = Product.SystemIdId 
) 
    table1 join Customer 
    on Customer.Id = CustomerIden 
) 
    table2 On s.Id = storeiden 
GROUP BY 
    s.Id 
+0

Warum Sie Ihre Zählung werfen schwimmt? Sie sollten Dezimalzahlen verwenden. Gleitkommazahlen sind ungefähre Datentypen. –

+0

@Dansichtlich verwenden Sie entweder mysql oder sql-server. Bitte entfernen Sie das andere Tag aus Ihrer Frage, da es keinem wirklichen Zweck dient, es sei denn, Ihr Code muss wirklich auf beiden Datenbanken laufen. –

Antwort

1

Keine Notwendigkeit für umfangreiche Unterabfrage-Nutzung, Joins einfache äußere genügt:

SELECT st.Id, 
     COUNT(DISTINCT sy.Id) AS SystemCount, 
     COUNT(DISTINCT pr.Id) AS ProductCount, 
     CASE WHEN COUNT(DISTINCT sy.Id) = 0 THEN 0 
      ELSE 1.0 * COUNT(DISTINCT pr.Id)/COUNT(DISTINCT sy.Id) 
     END AS Average 
FROM Store AS st 
LEFT JOIN Customer AS cu ON cu.DealerId = st.Id 
LEFT JOIN System AS sy ON sy.CustomerId = cu.Id 
LEFT JOIN Product AS pr ON pr.SystemId = sy.Id 
GROUP BY st.Id; 

query results

+0

Ich erhalte eine Fehlermeldung: Msg 8134, Ebene 16, Status 1, Zeile 36 Division durch Nullfehler aufgetreten. Warnung: Nullwert wird durch eine Aggregat- oder andere SET-Operation eliminiert. – Dan

+0

Es funktioniert mit Ihren Beispieldaten. Aktualisiert, um 'ISNULL' zu verwenden. –

+0

ausprobiert, dass ich immer noch diesen Fehler – Dan

0
SELECT 
    s.Id as Store, 
    COUNT(DISTINCT sys.id) as NumOfSystems, 
    COUNT(DISTINCT p.id) as NumOfProduct, 
    IFNULL(COUNT(DISTINCT p.id),0)/IFNULL(COUNT(Distinct sys.id),1) as average 
FROM Store s 
INNER JOIN Customer c 
ON c.dealerId = s.id 
INNER JOIN System sys 
ON sys.customerId = c.id 
INNER JOIN product p 
ON sys.id=p.systemId 
GROUP BY s.Id 
Verwandte Themen