4 combinaciones de tablas para que solo se dé una respuesta para cada empresa en lugar de un resultado para cada campaña
Pregunta
¡Gracias por tu ayuda!
Me gustaría mostrar todas las entradas de CompanyName que se hayan cargado en cualquiera de sus archivos de servidor como:
companies.companyName - count (files.fileID) - sum (serverFiles.uniqueUploads)
Initech Ltd. - 11 - 24931
Epiphyte Inc. - 23 - 938821
Aquí están las partes relacionadas con el recurso de la estructura de mi tabla:
Tabla: empresas
companyID (INT) - companyName (TEXT)
Tabla: campañas
campaignID(INT) - companyID (INT)
Tabla: archivos
fileID (INT) - campaignID (INT)
Tabla: serverFiles serverFileID (INT) - fileID (INT) - uniqueUploads (INT)
Cada empresa puede tener múltiples campañas.
Cada campaña puede tener varios archivos.
Cada archivo puede tener varios archivos de servidor
La consulta que intenté usar es la siguiente:
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;
Sin embargo, esto devuelve entradas múltiples para cada compañía (ya que crea múltiples salidas para cada compañía, una para cada campaña bajo la compañía).
por ejemplo:
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)
¿Cómo cambio la consulta para que solo me devuelva una respuesta para cada empresa, resumiendo todas las campañas de esa empresa?
Muchas gracias por cualquier ayuda.
Solución
Su consulta está bien, creo, excepto por la cláusula GROUP BY. Debería ser
GROUP BY companies.companyName
Otros consejos
Agregue el nombre de la compañía al grupo y realice un MIN / MAX para capturar uno en la lista de selección.
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;