2016-12-02 9 views
0

Ich versuche, eine INNER JOIN zu machen und Werte mit Informationen aus zwei Tabellen zu zählen. Das Problem ist, dass die Produktkategorie-Tabelle mehrere Zeilen mit dem gleichen oder ähnlichen Wert hat und mein COUNT() zu hoch ist.Verwenden Sie Tabelle mit mehreren Zeilen mit dem gleichen Wert

Meine beiden Tabellen

Verkaufstisch

Date    prod_id 
    2016-01-01  81 
    2016-01-01  82 
    2016-01-01  81 
    2016-10-01  80 
    2016-01-01  80 
    2016-01-02  80 
    2016-01-02  80 
    2016-01-02  81 
    2016-01-02  81 
    ....    .... 

Produkt Tisch

prodid   Name 
    80    Banana 
    81    Apple 
    82    Orange 
    83    Ice Cream 
    80    BANANAS 
    81    APPLE 
    82    
    83    Ice Cream 
    ....   .... 

Wenn ich eine INNER JOIN und die Anzahl der Vorkommen von beispielsweise zählen prod_id Ich bekomme eine unangemessen hohe Zahl, und meine Vermutung ist, dass es, weil es mehr als ein Vorkommen von prod_id 80 zum Beispiel gibt.

Haben Sie eine Idee für eine Lösung? Meine erste Reaktion war, die Procuct Tabelle zu wiederholen, aber es gibt viele andere Systeme, die von dieser Tabelle abhängen, also kann ich es eine absehbare Zukunft nicht ändern.

Meine Anfrage bisher:

SELECT 
pt.Date AS "Date", 
ft.Name AS "Product", 
COUNT(ft.Name) Number 
FROM SALES as pt 
INNER JOIN PROD_TABLE AS ft ON pt.prod_id=ft.prodid 
WHERE pt.Date BETWEEN '2016-01-01' AND '2016-01-30' 
GROUP BY pt.Date, ft.Name 
ORDER BY pt.Date DESC 

Erwartetes Ergebnis:

Date   Product  Number 
    2016-01-01 Banana  2 
    2016-01-01 Apple  2 
    2016-01-01 Orange  1 
+2

Zeigen Sie uns das erwartete Ergebnis und Ihren aktuellen Abfrageversuch. – jarlh

Antwort

0

Zunächst sollten Sie die Daten beheben. Eine Produkttabelle mit Duplikaten zu haben, erscheint unsinnig. Sie sollten nicht versuchen, solche Probleme zu umgehen, indem Sie komplexere Abfragen schreiben.

Das heißt, das ist ziemlich einfach in SQL Server zu tun. Ich denke, outer apply ist angemessen:

select p.name, count(*) 
from sales s outer apply (
    (select top 1 p.* 
     from product p 
     where p.name is not null and 
      p.prodid = s.prod_id -- note: the columns should have the same name 
    ) p; 
0

Ich denke, diese einfache Abfrage Ihre Anforderung löst:

select 
      date, 
      name, 
      count(name) 
    from product p inner join sales s 
    on s.prod_id=p.prodid group by date,name 
0

einfach die PROD_TABLE von einer Unterabfrage zu ersetzen, die Sie einzigartige prodid der und Namen gibt:

SELECT 
pt.Date, 
ft.Name AS "Product", 
COUNT(*) AS Number 
FROM SALES as pt 
LEFT JOIN (
     select prodid, min(Name) PROD_TABLE group by prodid 
) AS ft ON (pt.prod_id = ft.prodid) 
WHERE pt.Date BETWEEN '2016-01-01' AND '2016-01-30' 
GROUP BY pt.Date, ft.Name 
ORDER BY pt.Date DESC 

Aber imho dass PROD_TABLE wirklich aufgeräumt werden sollte.
Das Feld prodid sollte wahrscheinlich ein primärer Schlüssel werden.

Verwandte Themen