Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sum de deux colonnes dans deux tables

19 septembre 2021 à 19:22:32

bonjour,

je souhaite faire

la somme de la colonne sumPrice de la table take

la somme de la colonne sumPrice de la table enter

Mes résultats son toujours erronés voici ma requete pouvez vous m'aider svp

SELECT
A.itemNumber,
A.sumPriceTake,
B.sumPriceEnter

FROM ( 
	SELECT
		a.itemNumber,
		SUM(a.sumPrice) AS sumPriceTake
	FROM `take` a
	WHERE itemNumber IS NOT NULL
	GROUP BY itemNumber
	) A,
	( 
	SELECT
		b.itemNumber,
		SUM(b.sumPrice) AS sumPriceEnter
	FROM `enter` b
	WHERE itemNumber IS NOT NULL
	GROUP BY itemNumber
	) B
GROUP BY itemNumber



-
Edité par Sairus95 19 septembre 2021 à 19:24:00

  • Partager sur Facebook
  • Partager sur Twitter
19 septembre 2021 à 23:58:02

Je ne sais pas si c'est intéressant de faire ce que tu souhaites. Mieux vaudrait, je pense, faire 2 requêtes séparées. C'est plus simple à déboguer, c'est pas beaucoup plus lent.

Peut-être que ça ne joue pas sur les erreurs, mais, sois cohérent sur les termes. Quand tu écris A.itemNumber, c'est pas pour mettre un group by itemNumber (ligne 12).

J'ai testé chez moi en créant une mini DB avec 2 tables "semblables" aux tiennes. Quand je fais 2 requêtes séparées, j'obtiens ce que tu souhaites. Mais, quand je veux rassembler les requêtes, j'ai des erreurs chiantes à corriger.

  • Partager sur Facebook
  • Partager sur Twitter
20 septembre 2021 à 17:05:11

Bonjour,

Plutôt d'accord avec CR7, ici deux requêtes seraient plus propres.

Après, ta requête actuelle ne peut fonctionner car il n'y a aucune jointure, tout cela se croise et se mélange allègrement ...

Pour bien faire il faudrait :

SELECT
	I.itemNumber,
	COALESCE( T.sumPriceTake, 0 ) AS take,
	COALESCE( E.sumPriceEnter, 0 ) AS enter
FROM
	(
		-- Liste de tous les itemNumber possibles
		SELECT DISTINCT itemNumber
		FROM take
		UNION
		SELECT DISTINCT itemNumber
		FROM enter
	) I
		LEFT JOIN (
				-- Somme des take
				SELECT
					itemNumber,
					SUM(sumPrice) AS sumPriceTake
				FROM `take`
				WHERE itemNumber IS NOT NULL
				GROUP BY itemNumber
			) T
			ON I.itemNumber = T.itemNumber
		LEFT JOIN (
				-- Somme des enter
				SELECT
					itemNumber,
					SUM(sumPrice) AS sumPriceTake
				FROM `enter`
				WHERE itemNumber IS NOT NULL
				GROUP BY itemNumber
			) E
			ON I.itemNumber = T.itemNumber
GROUP BY I.itemNumber

Mais mieux encore, si tes deux tables take et enter sont identiques, n'en avoir qu'une seule nommée mouvement, avec une colonne valant take ou enter, serait plus rigoureux ...

-
Edité par Benzouye 20 septembre 2021 à 17:07:54

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
20 septembre 2021 à 22:51:24

Benzouye a écrit:


Mais mieux encore, si tes deux tables take et enter sont identiques, n'en avoir qu'une seule nommée mouvement, avec une colonne valant take ou enter, serait plus rigoureux ...

-
Edité par Benzouye il y a environ 5 heures

Je me suis dit que les tables se ressemblaient fortement, pour moi, c'étaient les mêmes. Mais, n'ayant pas beaucoup d'infos de la part de Sairus, je me suis dit que peut-être que c'était volontaire. J'avais cette idée de faire une colonne booléenne avec (0 pour dire que c'est take, 1 pour enter). J'avoue que j'adore les booléens :D

En tout cas, quand Benzouye est d'accord avec quelqu'un, c'est que ce dernier est en bonne voie dans son apprentissage.

  • Partager sur Facebook
  • Partager sur Twitter
21 septembre 2021 à 7:07:32

bonjour,

les tables sont identiques comme vous le dites. Voici la structure des deux tables

CREATE TABLE IF NOT EXISTS `take` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idTool` int(11) NOT NULL,
  `idEnter` int(11) NOT NULL,
  `idEnterMove` int(11) NOT NULL,
  `idProvider` int(11) NOT NULL,
  `idUser` int(11) NOT NULL,
  `idLocation` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  `sumPrice` float(10,2) DEFAULT NULL,
  `price` float(10,2) DEFAULT NULL,
  `fabricationOrder` int(11) DEFAULT NULL,
  `itemNumber` int(11) DEFAULT NULL,
  `wear` int(11) DEFAULT NULL,
  `weight` float(4,3) DEFAULT NULL,
  `date` datetime NOT NULL,
  `dateMove` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_taken_idProvider` (`idProvider`),
  KEY `FK_taken_idUser` (`idUser`),
  KEY `FK_taken_idLocation` (`idLocation`) USING BTREE,
  CONSTRAINT `FK_taken_idLocation` FOREIGN KEY (`idLocation`) REFERENCES `location` (`lo_id`),
  CONSTRAINT `FK_taken_idProvider` FOREIGN KEY (`idProvider`) REFERENCES `provider` (`pr_id`),
  CONSTRAINT `FK_taken_idUser` FOREIGN KEY (`idUser`) REFERENCES `user` (`us_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COMMENT='SORTIE DE STOCK';
CREATE TABLE IF NOT EXISTS `enter` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idTool` int(11) NOT NULL,
  `idEnter` int(11) NOT NULL,
  `idEnterMove` int(11) DEFAULT NULL,
  `idProvider` int(11) NOT NULL,
  `idUser` int(11) NOT NULL,
  `idLocation` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  `sumPrice` float(10,2) DEFAULT NULL,
  `price` float(10,2) DEFAULT NULL,
  `fabricationOrder` int(11) DEFAULT NULL,
  `itemNumber` int(11) DEFAULT NULL,
  `wear` int(11) DEFAULT NULL,
  `weight` float(4,3) DEFAULT NULL,
  `date` datetime NOT NULL,
  `dateMove` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `FK_return_idProvider` (`idProvider`),
  KEY `FK_return_dUser` (`idUser`),
  KEY `FK_return_idLocation` (`idLocation`) USING BTREE,
  CONSTRAINT `FK_return_dUser` FOREIGN KEY (`idUser`) REFERENCES `user` (`us_id`),
  CONSTRAINT `FK_return_idLocation` FOREIGN KEY (`idLocation`) REFERENCES `location` (`lo_id`),
  CONSTRAINT `FK_return_idProvider` FOREIGN KEY (`idProvider`) REFERENCES `provider` (`pr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COMMENT='ENTREE DE STOCK';


Le mieux pour vous est de créer un table qui reprenne les deux valeurs ?

  • Partager sur Facebook
  • Partager sur Twitter
21 septembre 2021 à 8:59:28

Si les tables sont identiques, je ferai plutôt une seule table mouvement avec toutes ces colonnes communes plus une colonne type_mouvement.

Cette colonne peut en effet être un booléen valant 0 ou 1 pour signifier qu'il s'agit d'une entrée (1) ou d'une sortie (0).

Cela te permet de simplifier la gestion et les calculs. Ta requête de départ serait donc juste :

SELECT
	M.itemNumber,
	SUM( IF( M.type_mouvement, 0, M.sumPriceTake ) ) AS prixSorties,
	SUM( IF( M.type_mouvement, M.sumPriceTake, 0 ) ) AS prixEntrees,
FROM mouvement M
GROUP BY M.itemNumber
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
21 septembre 2021 à 10:22:44

bonjour,

merci de votre réponse voici la table de créée

CREATE TABLE `movementStock` (
	`mv_id` INT(11) NOT NULL AUTO_INCREMENT,
	`mv_idTool` INT(11) NOT NULL,
	`mv_idUser` INT(11) NOT NULL,
	`mv_idProvider` INT(11) NOT NULL,
	`mv_typeMovement` INT(11) NOT NULL,
	`mv_itemNumber` INT(11) NOT NULL,
	`mv_sumPriceTake` FLOAT(10,2) NULL DEFAULT NULL,
	`mv_sumPriceEnter` FLOAT(10,2) NULL DEFAULT
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;

le résultat de la requête ci-dessus m’affiche zéro.
j’insère 1 dans la colonne 'mv_typeMovement' quand cette une entrée et 0 quand cette une sorti

Et pourquoi maintenant que la table est créée je fais pas simplement comme cela

SELECT
    mv_itemNumber,
    SUM(mv_sumPriceTake) AS prixSorties,
    SUM(mv_sumPriceEnter) AS prixEntrees
FROM movementStock
GROUP BY mv_itemNumber




-
Edité par Sairus95 21 septembre 2021 à 11:48:51

  • Partager sur Facebook
  • Partager sur Twitter
21 septembre 2021 à 13:17:25

Cela ne sert à rien de faire 2 colonnes price ...

Pour reprendre la structure existante je ferai :

CREATE OR REPLACE TABLE `movement` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`typeMovement` BOOLEAN NOT NULL,
	`idTool` int(11) NOT NULL,
	`idMovement` int(11) NOT NULL,
	`idMove` int(11) DEFAULT NULL,
	`idProvider` int(11) NOT NULL,
	`idUser` int(11) NOT NULL,
	`idLocation` int(11) NOT NULL,
	`quantity` int(11) NOT NULL,
	`sumPrice` float(10,2) DEFAULT NULL,
	`price` float(10,2) DEFAULT NULL,
	`fabricationOrder` int(11) DEFAULT NULL,
	`itemNumber` int(11) DEFAULT NULL,
	`wear` int(11) DEFAULT NULL,
	`weight` float(4,3) DEFAULT NULL,
	`date` datetime NOT NULL,
	`dateMove` datetime DEFAULT NULL,
	PRIMARY KEY (`id`) USING BTREE,
	KEY `FK_return_idProvider` (`idProvider`),
	KEY `FK_return_dUser` (`idUser`),
	KEY `FK_return_idLocation` (`idLocation`) USING BTREE,
	CONSTRAINT `FK_return_dUser` FOREIGN KEY (`idUser`) REFERENCES `user` (`us_id`),
	CONSTRAINT `FK_return_idLocation` FOREIGN KEY (`idLocation`) REFERENCES `location` (`lo_id`),
	CONSTRAINT `FK_return_idProvider` FOREIGN KEY (`idProvider`) REFERENCES `provider` (`pr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='MOUVEMENTS DE STOCK';

Et la requête :

SELECT
    M.itemNumber,
    SUM( IF( M.typeMovement, 0, M.sumPrice ) ) AS prixSorties,
    SUM( IF( M.typeMovement, M.sumPrice, 0 ) ) AS prixEntrees,
FROM movement M
GROUP BY M.itemNumber
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL