Utilice un valor de la mano izquierda en la comparación de SQL mano derecha
-
22-09-2019 - |
Pregunta
Tengo esta declaración SELECT
:
SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
AND dbo.MasterDates.SiteID = @X
Si se conecta el @From
, @To
y @X
funciona. Esto es ser la mano derecha de una comparación. Sin embargo, en la comparación del @X
tiene que venir desde el lado izquierdo de la prueba como el SELECT
en el exterior está llevando a cabo en cada SiteID
en el conjunto. Sin esta cláusula de la oración principal funciona. Tienen que ir juntos. Aquí está la instrucción de selección completa con lo anterior seleccionar la izquierda. Al final las dos cláusulas que tienen determinarán los productos clave para un sitio.
--INSERT INTO SiteKeyProducts
SELECT dbo.MasterDates.SiteID as SiteID , dbo.DLData.Product as ProductID
FROM dbo.MasterDates
JOIN dbo.DLData ON dbo.MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
GROUP BY dbo.MasterDates.SiteID , dbo.DLData.Product
HAVING
SUM(dbo.DLData.Quantity) > 960 OR
SUM(dbo.DLData.Quantity) > (SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
AND dbo.MasterDates.SiteID = @X)
ORDER BY dbo.MasterDates.SiteID
¿Cómo se utiliza la cláusula exterior en un estado interno? Demonios, ni siquiera sé si estoy utilizando la terminología correcta para describir mi problema.
Arrgghh - Establecer lógica basada hace mi cabeza en !!
Solución 2
Matt Whitfield en el ask.sqlservercentral StackExchange sitio se le ocurrió la siguiente respuesta a este problema :
SELECT outerMaster.SiteID as SiteID , dbo.DLData.Product as ProductID
FROM dbo.MasterDates outerMaster
JOIN dbo.DLData ON outerMaster.[ID] = dbo.DLData.DownloadID
WHERE outerMaster.[Date] BETWEEN @From AND @To
GROUP BY outerMaster.SiteID , dbo.DLData.Product
HAVING
SUM(dbo.DLData.Quantity) > 960 OR
SUM(dbo.DLData.Quantity) > (SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates innerMaster
JOIN dbo.DLData ON innerMaster.[ID] = dbo.DLData.DownloadID
WHERE innerMaster.[Date] BETWEEN @From AND @To
AND innerMaster.SiteID = outerMaster.SiteID)
ORDER BY outerMaster.SiteID
RickD ocurrió esta respuesta en la ask.sqlteam.com sitio:
--INSERT INTO SiteKeyProducts
SELECT
MD.SiteID as SiteID ,
DLD.Product as ProductID
FROM dbo.MasterDates MD
JOIN dbo.DLData DLD
ON MD.[ID] = DLD.DownloadID
LEFT JOIN (SELECT SiteID,
SUM(dbo.DLData.Quantity) SumMDQuantity
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
GROUP BY SiteID) as sumMD
ON sumMD.SiteID = MD.SiteID
WHERE MD.[Date] BETWEEN @From AND @To
GROUP BY MD.SiteID , DLD.Product
HAVING
SUM(DLD.Quantity) > 960 OR
SUM(DLD.Quantity) > sumMD.SumMDQuantity
ORDER BY MD.SiteID
Tanto gran trabajo, aunque supera a Matts esfuerzo Ricks a pesar de mi opinión inicial de que una de Ingreso sería más rápido. Matts toma ~ 10s 2m mientras Ricks toma ~ 40s 2m. Esto es por la mayor base de datos en vivo ya que tanto tarda menos de 10 segundos en el DB de prueba.
Otros consejos
Pienso que desea unirse a este sub consulta, lo utilice en un comunicado que tiene
SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
AND dbo.MasterDates.SiteID = @X