2010-10-14 4 views
1

Supposons qu'il y ait 100 enregistrements dans tableA et que tableA contient une colonne nommée 'price'.transact-sql question

Comment puis-je sélectionner le premier enregistrement n si la somme du prix> une certaine quantité (par exemple 1000) sans utiliser le curseur?

grâce

+0

@ user384080 - 1. quelle base de données? 2. La somme des prix selon quels critères? – InSane

+0

Souhaitez-vous additionner le prix groupé par une autre colonne et le tester? – MikeAinOz

+0

Je pense que vous avez tous mal compris la question désolé .. Fondamentalement, je dois additionner la colonne des prix et si la même a atteint la limite, puis prendre les dossiers. Donc, si le prix dans l'enregistrement # 1 + le prix dans l'enregistrement # 2 + le prix dans l'enregistrement # 3 a atteint la limite alors prenez ces trois enregistrements sinon continuez à boucler à travers les enregistrements jusqu'à atteindre la limite – user384080

Répondre

1

Top N implique une sorte d'ordre, que vous n'avez pas fourni, donc je suppose un ordre aléatoire.

Vous pouvez modifier cela sur la clause OVER du ROW_NUMBER().

Essayez quelque chose comme

DECLARE @Table TABLE(
     Price FLOAT 
) 

INSERT INTO @Table SELECT 1 
INSERT INTO @Table SELECT 11 
INSERT INTO @Table SELECT 12 
INSERT INTO @Table SELECT 15 
INSERT INTO @Table SELECT 10 
INSERT INTO @Table SELECT 65 
INSERT INTO @Table SELECT 100 

DECLARE @TotalPrice FLOAT 
SELECT @TotalPrice = 100 

;WITH Vals AS (
     SELECT *, 
       ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RNR 
     FROM @Table 
) 
, Totals AS (
     SELECT v.RNR, 
       SUM(vP.Price) TotalPrice 
     FROM Vals v LEFT JOIN 
       Vals vP ON v.RNR >= vP.RNR 
     GROUP BY v.RNR 
) 
, LimitValue AS (
     SELECT TOP 1 
       RNR 
     FROM Totals 
     WHERE TotalPrice >= @TotalPrice 
     ORDER BY RNR 
) 
SELECT * 
FROM Vals 
WHERE RNR <= (
        SELECT RNR 
        FROM LimitValue 
       ) 
+0

performance sage, est-ce mieux que le curseur? – user384080

+0

En général, les requêtes basées sur les ensembles sont plus rapides que les curseurs, mais vous devez tester et comparer cela. –

+0

oui .. ont testé pour les enregistrements 41K avec la sélection moyenne des enregistrements 12K, la requête dure 10 minutes .. est là pour l'accélérer? – user384080

-1

prix select de tableA où le prix> 1000 limite n;

n - no. des enregistrements que vous voulez en jeu de résultats

- Vive

+0

Je pense que vous avez tous mal compris la question désolé .. Fondamentalement, je dois additionner la colonne des prix et si la même a atteint la limite, puis prendre les dossiers. Donc, si le prix dans l'enregistrement # 1 + le prix dans l'enregistrement # 2 + le prix dans l'enregistrement # 3 a atteint la limite alors prenez ces trois enregistrements sinon continuez à boucler à travers les enregistrements jusqu'à atteindre la limite – user384080

+0

LIMIT n'est pas TSQL ... –