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 !!

¿Fue útil?

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