4 combinaciones de tablas para que solo se dé una respuesta para cada empresa en lugar de un resultado para cada campaña

StackOverflow https://stackoverflow.com/questions/1407359

  •  05-07-2019
  •  | 
  •  

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.

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top