2010-01-06 9 views
1

J'ai un casse-tête SQL aujourd'hui.TRANSACT SQL - Comment commander/indexer manuellement une table basée sur une instruction select/where

J'ai l'instruction SQL suivante:

SELECT MemberId, 
     UnitId, 
     MaterialLevel, 
     MaterialText, 
     ProductPercentage, 
     ProductPriority 
    FROM tblWeights 
ORDER BY MemberId, MaterialLevel, MaterialText, ProductPercentage DESC 

Maintenant, actuellement ProductPriority est vide. Ce que je voudrais faire est de mettre à jour ceci pour que le premier produit, par niveau, par materialtext avec le plus haut pourcentage de produit avec "1", le deuxième plus haut pourcentage avec "2", etc, etc

Cependant, quand le materialtext change, ceci devrait se réinitialiser et recommencer à "1".

Quelqu'un peut-il penser comment je peux faire cela?

+0

Cherchez-vous une requête SELECT avec un ordre de tri spécifique, ou une requête réelle UPDATE? – Tomalak

+0

Est-ce pour SQL Server? Si oui, quelle version? Cela ressemble à un travail pour l'analyse ... –

+0

Il s'agit d'une requête de mise à jour, j'ai juste sauté le select pour montrer la commande. Cela fonctionne sur SQL Server 2008. – MrDean

Répondre

0

Vous pouvez l'utiliser pour la mise à jour initiale:

UPDATE tblWeights w1 
SET ProductPriority = (
      SELECT COUNT(*) 
      FROM tblWeights w2 
      WHERE w2.level  = w1.level 
      AND w2.materialText = w1.materialText 
      AND w2.ProductPercentage >= w1.ProductPercentage 
     ) 

Pour la remise à zéro automatique, vous devriez probablement écrire un déclencheur qui déclenche au niveau de l'instruction après DELETE, UPDATE et INSERT. Vous pouvez utiliser une version modifiée de cette déclaration, et seulement mettre à jour les lignes ayant le niveau affecté, la combinaison materialtext

CREATE TRIGGER aiud_tblWeights ON tblWeights 
FOR INSERT, UPDATE, DELETE 
AS 
IF(UPDATE (Level) OR UPDATE (MaterialText)) 
BEGIN 
    UPDATE tblWeights w1 
    SET ProductPriority = (
       SELECT COUNT(*) 
       FROM tblWeights w2 
       WHERE w2.level  = w1.level 
       AND w2.materialText = w1.materialText 
       AND w2.ProductPercentage >= w1.ProductPercentage 
      ) 
    WHERE (w1.level, w1.materialText) IN (
     SELECT level, materialText 
     FROM inserted 
     UNION ALL 
     SELECT level, materialText 
     FROM deleted 
    );   
END; 
1

Y at-il une raison quelconque vous voulez productpriority explicitement stockées dans la base de données? Désolé si j'ai mal compris votre question mais cela semble pouvoir être traité avec un ROW_NUMBER droit dans la requête de sortie.

+0

Le nombre de lignes semble être la meilleure solution. La seule raison de ne pas y aller est s'ils veulent indexer la colonne et y faire des recherches. Cela semblerait peu probable cependant. –

Questions connexes