0
votes

MySQL Sélectionnez Ifnull puis comparez-le numériquement avec une autre colonne

J'ai essayé de nombreuses méthodes pour traduire NULL au numéro 0 lors de la sélection:

CREATE TABLE `f_salary` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `staff_id` int(11) NOT NULL,  `amount` decimal(12,2) DEFAULT NULL,  `note` tinytext,  `ref_date` date DEFAULT NULL,  `month_year` date DEFAULT NULL,  `created` datetime DEFAULT NULL,  `created_by` int(11) DEFAULT NULL,  `updated` datetime DEFAULT NULL,  `updated_by` int(11) DEFAULT NULL,  `approved` datetime DEFAULT NULL,  `approved_by` int(11) DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `staff_id` (`staff_id`),  CONSTRAINT `f_salary_ibfk_1` FOREIGN KEY (`staff_id`) REFERENCES `f_salary_staff` (`id`) ON DELETE CASCADE ON UPDATE CASCADE )


5 commentaires

Je ne comprends pas votre requête, "où S.Amount> Ss.Amount" ne peut pas fonctionner comme S.Amount n'existe pas du tout


Désolé .. cela devrait être un montant A.Paid ... Comment puis-je modifier la question?


Je ne comprends pas tes tables. Mes hypothèses: il y a un l'utilisateur et sa clé principale est le user_id . Il y a une table et son PK est le staff_id . Mais: Comment sont les deux liés? Est-ce que la table a un staff_id de sorte que chaque utilisateur appartient à un personnel? Le tableau f_salary a un staff_id plutôt qu'un user_id , donc un salaire est sur un personnel non sur un utilisateur? Et chaque utilisateur de ce personnel reçoit ce salaire ou le divisez-vous entre eux? Et ensuite la table f_salary_staff a un user_id où le nom suggère qu'il devrait avoir un staff_id à la place ...


... S'il vous plaît expliquer vos tables. Que représentent-ils? Quelles sont leurs clés?


Salut là-bas .. j'ai déjà mis la déclaration de table pour référence .. espérons que cela aide


3 Réponses :


0
votes

La sélection n'a même pas énuméré ceux avec des valeurs NULL P>

parce que vous avez un code> rejoindre code> qui est tourné vers un joint interne code> par code> par le où code> clause.
Déplacez la condition dans la clause sur code>.
Également dans la requête jointe à gauche, vous sélectionnez la colonne staff_id code> bien qu'il ne soit pas inclus dans le groupe par code> clause comme il le devrait.
Changer de ceci: p>

SELECT ss.id AS staff_id, u.realname AS realname, ss.amount AS salary_amount, 
COALESCE(s.paid_amount, 0) AS paid_amount,
ss.amount - COALESCE(s.paid_amount, 0)
FROM f_salary_staff ss 
INNER JOIN user u ON (u.id=ss.user_id) 
LEFT JOIN (
  SELECT staff_id, ref_date, SUM(amount) AS paid_amount 
  FROM f_salary 
  WHERE month_year='2020-02-29' 
  GROUP BY staff_id, ref_date
) s ON (ss.id=s.staff_id) AND s.paid_amount > ss.amount


6 commentaires

err .. Mon problème est que je veux tourner les valeurs nulelles résultant de la jointure gauche à 0,00 numérique (S.Paid_Amount) afin que je puisse le comparer à la colonne Ss.Amount ... est-il même possible de tourner NULL alors quelque chose numérique?


C'est ce que fait coalesce. Tous les nulls retournés par la jointure gauche seront de 0 dans les résultats.


Oui .. j'ai obtenu le résultat comme 0,00.


essayé cela .. Les rangées avec une valeur null à l'origine de S.Paid_Amount n'ont pas comparu :(


L'utilisation de coalesction ne modifie pas le nombre de lignes retournées, il change simplement des nuls à 0. Vérifiez votre exigence et votre code. Le code de ma réponse concerne la question que vous avez posté la question suivante: (1) * Pourquoi vous n'obtenez pas les lignes avec NULLS * et la réponse est parce que vous abusez à la suite de la jointure gauche et (2) comment faire apparaître les nulls comme 0 et la réponse est avec la coalesce.


Laissez-nous Continuez cette discussion en chat .



0
votes

Si je comprends bien votre besoin, la requête suivante doit fonctionner:

SELECT t.*
FROM (
  SELECT 
    ss.id AS staff_id, 
    u.realname AS realname, 
    ss.amount AS salary_amount, 
    COALESCE(s.paid_amount, 0) AS paid_amount 
  FROM f_salary_staff ss 
  INNER JOIN user u ON (u.id=ss.user_id) 
  LEFT JOIN (
    SELECT staff_id, ref_date, SUM(amount) AS paid_amount 
    FROM f_salary 
    WHERE month_year='2020-02-29' 
    GROUP BY staff_id, ref_date
  ) s ON (ss.id=s.staff_id) 
) t
WHERE paid_amount > salary_amount


5 commentaires

essayé ceci ... n'a pas fonctionné .. J'ai modifié l'énoncé Select, espérons-le que vous pourriez mieux comprendre ... La 5ème colonne n'apparaît que si la 3ème et la 4ème colonne est numériquement légale.


Quel est le problème avec ma requête comparée à votre besoin? Qu'est-ce que j'ai manqué?


GOSFLY .. Cette déclaration ne donne rien :( ... Je soupçonne que la coalesce ne pose que le 0 pour montrer à la place pour qu'elle soit comparable ... vous avez une autre idée?


La sous-requête vous retourne-t-elle quelque chose?


Gosfly .. Désolé ... quelle sous-requête?



-1
votes

merci à des forpas et de gosgly .. apparemment regroupant ou si -Lull ou même si vous ne pouvez pas modifier le NULL à autre chose que NULL ou NOT PAS NULL .. Le résultat n'est que pour le spectacle, mais pas la valeur réelle de celle-ci. J'ai changé la déclaration à ce type xxx

merci à tous!


1 commentaires

ifnull (s.paid_amount, 0.00) est identique à celui coalesce (S.Paid_Amount, 0.00) et si (S.Paid_Amount est null, Ss.Amount, Ss.Amount-S.Paid_Amount) est identique à celui de Ss.Amount - coalesce (S.Paid_Amount, 0) Quelle est la différence? Aussi apparemment regrouper ou ifnull ou même si vous ne pouvez pas modifier le null à autre chose que NULL ou NOT PAS NULL est totalement faux.