Unione di 4 tabelle in modo che venga data 1 sola risposta per ogni azienda anziché un risultato per ogni campagna
Domanda
Grazie per l'aiuto!
Vorrei produrre tutte le voci companyName che hanno caricamenti su uno dei loro file Server come:
companies.companyName - count (files.fileID) - sum (serverFiles.uniqueUploads)
Initech Ltd. - 11 - 24931
Epiphyte Inc. - 23 - 938821
Ecco le parti relavent della struttura della mia tabella:
Tabella: aziende
companyID (INT) - companyName (TEXT)
Tabella: campagne
campaignID(INT) - companyID (INT)
Tabella: file
fileID (INT) - campaignID (INT)
Tabella: file server serverFileID (INT) - fileID (INT) - uniqueUploads (INT)
Ogni azienda può avere più campagne.
Ogni campagna può avere più file.
Ogni file può avere più file server
La query che ho provato a utilizzare è la seguente:
SELECT companies.companyName, sum(serverFiles.uniqueUploads), count(files.fileID)
FROM companies
INNER JOIN campaigns on companies.companyID = campaigns.companyID
INNER JOIN files on files.campaign = campaigns.campaignID
LEFT OUTER JOIN serverFiles on serverfiles.fileID = files.fileID
GROUP BY serverFiles.uniqueUploads, files.fileID
ORDER BY sum(serverFiles.uniqueUploads) DESC;
Tuttavia, questo restituisce più voci per ogni azienda (in quanto crea più output per ciascuna società, una per ogni campagna della società).
es:
companies.companyName - count (files.fileID) - sum (serverFiles.uniqueUploads)
Initech Ltd. - 2 - 234234 (for initech campaign1)
Initech Ltd. - 4 - 223323 (for initech campaign2)
Epiphyte Inc. - 13 - 6434 (for epiphyte campaign1)
Initech Ltd. - 1 - 554 (for initech campaign3)
Epiphyte Inc. - 13 - 7544 (for epiphyte campaign2)
Epiphyte Inc. - 11 - 74545 (for epiphyte campaign3)
Epiphyte Inc. - 23 - 456544 (for epiphyte campaign4)
Come posso modificare la query per restituirmi una sola risposta per ciascuna società, riassumendo tutte le campagne di quella società.
Grazie mille per qualsiasi assistenza.
Soluzione
La tua richiesta va bene, credo, fatta eccezione per la clausola GROUP BY. Dovrebbe essere
GROUP BY companies.companyName
Altri suggerimenti
Aggiungi il nome dell'azienda al gruppo ed esegui un MIN / MAX per afferrarne uno nell'elenco di selezione.
SELECT MAX(companies.companyName), sum(serverFiles.uniqueUploads), count(files.fileID)
FROM companies
INNER JOIN campaigns on companies.companyID = campaigns.companyID
INNER JOIN files on files.campaign = campaigns.campaignID
LEFT OUTER JOIN serverFiles on serverfiles.fileID = files.fileID
GROUP BY companies.companyName, serverFiles.uniqueUploads, files.fileID
ORDER BY sum(serverFiles.uniqueUploads) DESC;