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.
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. –
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
@ O.Jones Ich möchte 2 Spalten auswählen ('count (distinct P.ProductID), SUM (Sales.XX)' in jedem meiner Select – Bobby