Frage

Ich habe diese SELECT Anweisung:

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

Wenn Sie in der @From, @To Plug-and-@X es funktioniert. Dies ist die rechte Seite eines Vergleichs sein. Jedoch im Vergleich benötigt der @X auf der linken Seite des wie die SELECT auf der Außenseite zu kommen, ist die Durchführung Test auf jedem SiteID im Set. Ohne diese Klausel arbeitet der Hauptsatz. Sie müssen zusammen gehen. Hier ist die vollständige select-Anweisung mit der oben wählen Sie links in. Schließlich werden die beiden having-Klauseln werden die wichtigsten Produkte für eine Website bestimmen.

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

Wie verwenden Sie die äußere Klausel auf einer inneren Aussage? die Hölle, ich weiß nicht einmal, ob ich die richtige Terminologie bin mit meinem Problem zu beschreiben.

Arrgghh - Set basierte Logik funktioniert meinen Kopf in !!

War es hilfreich?

Lösung 2

Matt Whitfield auf der ask.sqlservercentral Stack Website kam mit der folgenden Antwort auf dieses Problem :

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

Und RickD kam mit dieser Antwort auf dem Spiel ask.sqlteam.com Website:

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

Beide arbeiten groß, obwohl Matts Bestzeiten Ricks Anstrengung trotz meiner anfänglichen Auffassung, dass ein schneller wäre Mitglied werden. Matts nimmt ~ 2m 10s während Ricks ~ 2m 40s dauert. Dies ist für die größte Live-Datenbank, da beide in weniger als 10 s auf dem Test db.

Andere Tipps

Ich glaube, du diese Unterabfrage anschließen möchten, verwenden Sie es nicht in einer mit Anweisung

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top