0
votes

Comment calculer la quantité sur la main pour chaque lot (mySQL)

Ceci est le Détails de la transaction Tableau

J'essaie de Concevez une base de données d'inventaire MySQL. Je considère tous les type: 1 code> rangez un lot de produit (lot). p>

La colonne code> code> est 1 code> pour IN et 0 code> pour chaque transaction. détaillant_id code> fait référence à la colonne code> ID code>. p>

Comment puis-je obtenir ce résultat: p>

 id   item  sum(quantity)
  1     1         3            [10-(5+2)]
  4     1         0            (5-5)
  6     2         20            20


1 commentaires

Quel attribut définit l'ordre des enregistrements dans un groupe avec le même article ? "Commande de position" est une mauvaise réponse ... CAN ID Soyez cet attribut?


3 Réponses :


1
votes
WITH cte AS (
  SELECT *, 
         SUM(detail_id IS NULL) OVER (PARTITION BY item ORDER BY id) group_num 
  FROM details
)
SELECT MIN(id) id,
       item,
       SUM( CASE type WHEN 1 THEN quantity 
                      WHEN 0 THEN -quantity 
                      END ) `sum(quantity)`
FROM cte
GROUP BY item, group_num;
fiddle

2 commentaires

Performance sage entre votre réponse et @sebastian Brosch's qu'est-ce que vous pensez le mieux?


@GRIMDBX Test sur la matrice de données réelle. Enquêter sur les plans d'exécution. Créer des indices appropriés. Personne ne peut répondre, il vaut mieux avoir aucune information source ...



0
votes

Vous pouvez utiliser ceci:

SELECT 
  lots.id,
  MIN(lots.item) AS item,
  MIN(lots.quantity) - IFNULL(SUM(details.quantity), 0) AS quantity 
FROM (
  SELECT id, item, quantity 
  FROM details
  WHERE type = 1
) lots LEFT JOIN details ON lots.id = details.detail_id 
GROUP BY lots.id
ORDER BY lots.id


2 commentaires

Veuillez expliquer le résultat de votre requête sur un Fiddle avec des données source mises à jour.


Vous avez ajouté des 3 premières lignes à nouveau, où les 2e et 3ème rangées ont détaillé_id qui fait référence à la toute première ligne ( ID 1 ) afin que le calcul est de 10- (5 + 2 + 5 + 2) = - 4 .



0
votes

J'ai modifié votre Fiddle . J'ai changé que l'on pense à votre table existante, vous devez spécifier détaillant_id, où qu'il soit null, afin que nous puissions regrouper le résultat à ce sujet.

La requête finale ressemblera à xxx

Obtenir la somme de la quantité de type spécifiée en regroupant sur détaillant_id, élément, puis utilisez ce résultat pour calculer la sortie finale. < / p>


3 commentaires

Je devrais faire une mise à jour supplémentaire sur les lignes en lignes pour insérer l'ID incrémenté automatique.


Sans cela comment identifiez-vous le détaillant correspondant?


Vérifiez @ la réponse d'Akina ci-dessus.