2017-01-25 4 views
-1

Ich habe die folgende Abfrage, die gut funktionieren, wenn ich eine Spalte auswähle, aber ich muss 2 Spalten in alle meine Select-Anweisung auswählen und ich habe keine Ahnung, warum es nicht funktioniert. Irgendeine Idee, wie ich es bitte machen kann?Join 3 Tabellen mysql

SELECT (select count(distinct P.ProductID), SUM(Sales.XX) 
     from Product P 
     LEFT JOIN Product_Classification PC 
     ON P.ProductID = PC.ProductID 
     LEFT JOIN Classification C 
     ON PC.ClassificationID = C.ClassificationID, Sales 
     where P.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 
     and C.Classification_Number IN ('1.5101','45565')) AS first_clause, 

(select count(distinct P1.ProductID), SUM(Sales.XX) 
     from Product P1 
     LEFT JOIN Product_Classification PC 
     ON P1.ProductID = PC.ProductID 
     LEFT JOIN Classification C 
     ON PC.ClassificationID = C.ClassificationID, Sales 
     where P1.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 
     and C.Classification_Number ='1.00') AS second_clause, 
(
select count(distinct P.ProductID), SUM(Sales.XX) 
     from Product P 
     LEFT JOIN Product_Classification PC 
     ON P.ProductID = PC.ProductID 
     LEFT JOIN Classification C 
     ON PC.ClassificationID = C.ClassificationID, Sales 
     where P.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 
     and C.Classification_Number ='1.5101') AS third_clause; 
+0

Können Sie bitte Ihre Frage zu klären? Sie sagen, Sie wählen eine Spalte aus. Aber Ihre SELECT-Anweisung scheint drei Spalten auszuwählen, die alle von Aggregaten generiert werden. –

+0

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql- Abfrage – Strawberry

+0

@ O.Jones Ich möchte 2 Spalten auswählen ('count (distinct P.ProductID), SUM (Sales.XX)' in jedem meiner Select – Bobby

Antwort

0

Diese Unterabfrage verbindet alten und neuen Stil.

 select count(distinct P.ProductID), SUM(Sales.XX) 
      from Product P 
    LEFT JOIN Product_Classification PC ON P.ProductID = PC.ProductID 
    LEFT JOIN Classification C ON PC.ClassificationID = C.ClassificationID, 
       Sales /* !!! comma join !!! */ 
    where P.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 

Im alten Stil (1990er Jahre Komma Stil) Beitritt ist aus einem wirklich guten Grund veraltet. Und die Stile mischen? Nein einfach nein. Beginnen wir damit, dies als alle neuen Stil-Joins neu zu gestalten.

 select count(distinct P.ProductID), SUM(Sales.XX) 
      from Product P 
    LEFT JOIN Product_Classification PC ON P.ProductID = PC.ProductID 
    LEFT JOIN Classification C ON PC.ClassificationID = C.ClassificationID, 
    INNER JOIN Sales ON P.ProductID = Sales.ProductIDS 
     WHERE Sales.XX = 'COOKIES' 

Dann machen wir es zu einem richtigen GROUP BY-Vorgang.

 select C.Classification_Number, 
       COUNT(distinct P.ProductID) Product_Count, 
       SUM(Sales.XX) Sales_Sum 
      from Product P 
    LEFT JOIN Product_Classification PC ON P.ProductID = PC.ProductID 
    LEFT JOIN Classification C ON PC.ClassificationID = C.ClassificationID, 
    INNER JOIN Sales ON P.ProductID = Sales.ProductIDS 
     WHERE Sales.XX = 'COOKIES' 
     GROUP BY C.Classification_Number 

Versuchen Sie diese Abfrage.

Dann können Sie dies verwenden, um Ihre Details nach Klassifizierung zu extrahieren.

In der Welt von SQL machen Sie zwei Dinge: Einer aggregiert und der andere dreht sich, sodass in den Zeilen einer Ergebnismenge in den Zeilen einer natürlichen SQL-Ergebnismenge Daten angezeigt werden.

Pivoting ist (wie Sie versehentlich entdeckt haben) ein kolossaler Schmerz im Nacken in MySQL. Am besten ist es in einem Client-Software-Paket (php? Java?). Wenn Sie es in MySQL tun müssen, wird es in etwa so aussehen.

SELECT 
    SUM(CASE WHEN Class IN ('1.5101','45565') THEN Product_Count ELSE 0 END) ap, 
    SUM(CASE WHEN Class IN ('1.5101','45565') THEN Sales_Sum  ELSE 0 END) as, 
    SUM(CASE WHEN Class = '1.00'    THEN Product_Count ELSE 0 END) bp, 
    SUM(CASE WHEN Class = '1.00'    THEN Sales_Sum  ELSE 0 END) bs, 
    SUM(CASE WHEN Class = '1.501'    THEN Product_Count ELSE 0 END) cp, 
    SUM(CASE WHEN Class = '1.501'    THEN Sales_Sum  ELSE 0 END) cs 
FROM (
      select C.Classification_Number Class, 
        COUNT(distinct P.ProductID) Product_Count, 
        SUM(Sales.XX) Sales_Sum 
       from Product P 
     LEFT JOIN Product_Classification PC ON P.ProductID = PC.ProductID 
     LEFT JOIN Classification C ON PC.ClassificationID = C.ClassificationID, 
     INNER JOIN Sales ON P.ProductID = Sales.ProductIDS 
      WHERE Sales.XX = 'COOKIES' 
      GROUP BY C.Classification_Number 
    ) aggregate 

Hinweis in dieser Pivot-Abfrage, wie das ganze Aggregat Abfrage hier als Unterabfrage verwendet wird, und die CASE WHEN ... THEN ... ELSE 0 END Klauseln verwendet werden, um die Werte für die Kategorien ziehen Sie aufaddiert.

Um dies zum Laufen zu bringen: Holen Sie sich zuerst die aggregierte Abfrage. Stellen Sie sicher, dass Sie glauben, dass es korrekt ist. Dann wickle es in den schwenkbaren Kram.

+0

Durch Auswahl von 'C.Classification_Number' gibt meine Abfrage viele Zeilen zurück, aber alles, was ich wirklich brauche, ist eine Zeile, die' COUNT' und 'SUM' enthält, auch wenn es nicht erwähnt wird Diese 'C.Classification_Number IN ('1.5101', '45565')' enthält tatsächlich mehr als 200 Nummern – Bobby