Domanda

Ho questa affermazione 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

Se si collega il @From, @To e @X funziona. Questo deve essere il lato destro di un confronto. Tuttavia, in confronto al @X deve venire dal lato sinistro della prova come SELECT all'esterno sta eseguendo su ogni SiteID nel set. Senza questa clausola la frase principale funziona. Hanno bisogno di andare insieme. Ecco la dichiarazione prescelta completa con quanto sopra selezionare lasciato in. Alla fine i due hanno clausole determineranno i prodotti chiave per un sito.

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

Come si utilizza la clausola esterno su una dichiarazione interiore? Diavolo, non so nemmeno se sto usando la terminologia corretta per descrivere il mio problema.

Arrgghh - logica basata Set fa la mia testa !!

È stato utile?

Soluzione 2

Matt Whitfield sul ask.sqlservercentral sito StackExchange si avvicinò con la seguente risposta al questo 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 si avvicinò con questa risposta sulla ask.sqlteam.com sito:

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

Entrambi funzionano grande, anche se Matts Migliori prestazioni sforzo Ricks nonostante la mia vista iniziale che una registrazione sarebbe più veloce. Matts prende ~ 10s 2m mentre Ricks prende ~ 40s 2m. Questo è per il più grande database dal vivo sia come richiede meno di 10 secondi sul db di prova.

Altri suggerimenti

Penso che si desidera partecipare a questo subquery, non lo uso in una dichiarazione che ha

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top