0
votes

Tableau de mise à jour à l'aide de la sous-requête

J'ai une table FOO avec les attributs suivants: xxx

étant donné qu'un exemple d'enregistrement est: xxx

Je veux que la sortie de la requête soit xxx

en d'autres termes, la colonne doit être le résultat de: < Code> prix / n où n est le nombre de fois que la barre indiquée existe dans le jeu d'enregistrements.

J'ai réussi à compter le nombre de Barres qui existent en utilisant: xxx

Cependant, je n'ai aucune idée de la manière dont je vais appliquer ceci à la division du prix .

merci!


2 commentaires

Personnellement, je ne stockerais pas de valeurs comme celle-ci dans la base de données. La principale raison étant que vous devez mettre à jour chaque ligne avec cet identifiant ( bar ) chaque fois qu'une rangée insérée, supprimée ou mise à jour. Cela va probablement nécessiter des déclencheurs. Vous seriez probablement mieux à l'aide d'une vue .


Et que se passe-t-il quand une barre donnée a des prix différents? Quel prix utilisez-vous dans votre calcul? Supposez-vous que tous les prix sont les mêmes pour un barreau donné? Est-ce une hypothèse sûre ?


3 Réponses :


4
votes

Vous pouvez utiliser les fonctions de fenêtre et la division: xxx pré>

Demo H2> P>

Notez que SQL Server fait une division entière. Donc si prix code> est un entier, vous pouvez obtenir un résultat plus précis avec: p> xxx pré>

édition: p>

Le titre dit "Mise à jour", mais la question ne mentionne que des résultats. Si vous souhaitez une mise à jour, utilisez une CTE ou une sous-requête mise à jour: P>

with toupdate as (
      select t.*, 
             price / count(*) over (partition by bar) as new_price
      from t
     )
update toupdate
    set new_price = price
    where price <> new_price;


5 commentaires

C'est probablement la meilleure réponse ici +1, et je l'aurais donné moi-même, s'attendre à ce que Gordon soit en fait un programme AI créé par le débordement de la pile.


Hey Stackoverflow. . . Si vous souhaitez créer un tel programme AI, je serais ravi d'aider.


D'accord avec @TimbieGeleisen!


Merci beaucoup!! Cette solution était parfaite! La modification était également pertinente, car comme vous l'avez mentionné, j'ai oublié d'ajouter la partie de mise à jour sur la question (désolé de cela)!


Très drôle de discussion! Personnellement, j'ai vraiment considéré Gordon étant une AI, surtout le mois dernier lorsque j'ai commencé à suivre la balise SQL ... Merci de la scolarisation Gordon!



1
votes

Utilisez une sous-requête corrélée pour calculer le diviseur:

fooid | bar | (No column name)
----: | --: | ---------------:
    1 | 332 |                5
    2 | 332 |                5
    3 | 333 |                5
    4 | 334 |               10
    4 | 334 |               10
    4 | 334 |               10


0 commentaires

2
votes

Vous pouvez utiliser un CTE qui trouve les comptes pour chaque groupe code> bar code>, puis rejoignez-le pour trouver les quotients:

WITH cte AS (
    SELECT Bar, COUNT(*) AS cnt
    FROM yourTable
    GROUP BY Bar
)

SELECT t1.FooID, t1.Bar,
   1.0 * t1.Price / t2.cnt AS NewPrice
FROM yourTable t1
INNER JOIN cte t2
    ON t1.Bar = t2.Bar
ORDER BY
    t1.Bar, t1.FooID;


0 commentaires