8
votes

Comment diviser deux valeurs de la même colonne de SQL

Comme le titre dit que je voudrais diviser deux valeurs les unes avec les autres dans la même colonne. Par exemple xxx

dans cet exemple de colonne D serait dérivé de la colonne C, où la valeur de 2012 est soustraite à partir de 2011, puis des temps par un 100 pour obtenir le pourcentage.

Je ne sais pas comment définir la requête, j'ai essayé de faire un tas de sous-requêtes, mais je ne savais pas comment les relier. Toute aide serait grandement appréciée.


4 commentaires

Si j'étais vous, je le ferai en dehors de SQL, par ex. faire la logique en php.


Vous ne pouvez pas le faire avec SQL simple, que vous devez utiliser une procédure / fonctions stockées dans la base de données ou une langue latérale du serveur pour mettre en œuvre la logique commerciale.


@Adamplocher SQL Server 2008 R2


@Piyasde Un auto-jointure à SQL accomplira ceci pour l'OP; une procédure ou une fonction stockée n'est pas requise.


7 Réponses :


0
votes

Essayez ceci:

SELECT t1.type A, t1.year B, t1.value C,
IF(
  EXISTS(
    SELECT 1 FROM table t2 WHERE t1.type = t2.type AND t1.year = (t2.year - 1)
  ),
  ((SELECT t3.year FROM table t3 WHERE t1.type = t3.type AND t1.year = (t3.year - 1)) - t1.year)/t1.year,
  0
) D
FROM table t1


0 commentaires

1
votes

Je suis d'accord avec Shivan, mais seulement parce que je ne sais pas comment le faire sans PHP. Avec PHP, il suffit de tirer les deux totaux, de faire les mathématiques et d'envoyer une requête avec les réponses.

Assurez-vous également de lire ceci parce que c'est la partie la plus importante forte> Tes maths tortent. (shirts2011 - shirts2012) * 100 code> ne vous donne pas le pourcentage de changement. Il vous donne juste 100 fois la différence des deux code> (en fait, la différence négative basée sur votre libellé). Ce que vous voulez, math-sage, c'est: p> xxx pré>

Je sais que les parens extérieurs ne sont pas nécessaires, mais ils facilitent la lecture. Le changement de pourcentage est identique à 100 fois le rapport de la différence des deux à l'initiale. P>

édité pour ajouter du code PHP. Em> p>

Le PHP a l'air brut, mais cela fait du travail. p> xxx pré>

Initialise votre table où les colonnes D 2011 D = 0. P>

UPDATE yourTable SET D = 0 WHERE B = 2011;


1 commentaires

lol je sais que la formule vient de faire l'écriture paresseuse, je pensais que la partie la plus importante tentait de comprendre comment diviser deux valeurs dans la même colonne. Je m'excuse si cela fait une différence cependant. Je ne suis pas aussi familier avec PHP que je n'ai pas utilisé avant. Je vais essayer la solution d'Aiias demain, mais dans le même temps, tout le monde a une autre solution?



1
votes

Si je comprends vos besoins correctement, vous pouvez utiliser un CTE récursif pour accomplir vos résultats. Ceci utilise Row_Number () code> et partitions par (Groupes par) Colonne A.

Cette méthode fonctionnerait mieux si vous ne pouvez pas garantir des années séquentielles dans la colonne B. Si vous avez toujours séquentiel années, alors Bobs fournit la meilleure alternative. em> p> xxx pré>

SQL Fiddle Demo P>

Cela retournera la différence entre chaque année et le groupe précédent par colonne A. Il utilise une 2e CTE uniquement pour la simplicité. Si vous voulez que le pourcentage réel a changé, mettez à jour la formule ci-dessus. P>

- Modifier strud> p>

car il vous ressemble " Recherchez la croissance en pourcentage, essayez de remplacer PRC YC-CC avec cette formule à la place: P>

cast(y.C as decimal(10,2))/cast(c.C as decimal(10,2))


3 commentaires

Merci SGEDDES Je vais essayer cela demain, j'ai une question rapide, CTE est qu'un autre mot pour la sous-requête?


@ user2167857 - Oui, il suffit de faciliter la réécriture :) dépend de vos besoins - cela fonctionnera bien si des années ne sont pas nécessairement séquentielles (2011-2013), par exemple. Si toutefois, ils sont toujours garantis pour être séquentiels, il existe des alternatives plus faciles (Bobs fournit un par exemple). Dépend juste de vos besoins. Bonne chance.


Merci de votre aide, je l'apprécie vraiment, comme vous l'avez dit BOBS Réponse a fonctionné le mieux pour moi, bien que je puisse vraiment apprécier, vous prenez le temps de vous aider à m'aider.



0
votes

Essayez ceci:

select Y2013.*, Y2012.C, Y2013.C, Y2013.C/Y2011.C
from (
  select * from data where B = year(getdate())
) Y2013
left join (
  select * from data where B = year(getdate()) - 1
) Y2012 on Y2012.A = Y2013.A
left join (
  select * from data where B = year(getdate()) - 2
) Y2011 on Y2011.A = Y2012.A
 and  Y2011.A = Y2013.A


2 commentaires

Je pensais faire cela de cette façon, mais cela serait mis dans un paquet SSIS, puis jeté dans une table, à utiliser à l'avenir, l'année prochaine 2014 sera ajoutée et 2011 sera partie.


@ user2167857: Quelle est la négligence de moi; vérifie maintenant.



2
votes

Voici une option pour obtenir ce que vous avez après xxx

exemple SQL Fiddle


9 commentaires

J'ai une question rapide que vous avez entré +1 à la fin de la colonne T2.B et je me demandais simplement ce que c'était pour?


C'est comme ça qu'il rejoint une rangée à une autre. Ainsi, une valeur T1.B correspond à la valeur de T2.B + 1 ou 2011 = 2010 + 1. T1 est la ligne 2011 et T2 est la rangée 2010.


Hey @bobs désolé de déranger tellement que je suis assez nouveau à SQL, alors j'apprends toujours toutes les cordes. J'ai écrit le SQL suivant et j'ai reçu une valeur de colonne pour PCT comme tous les 0 0, toute aide? Sélectionnez A.Fiscalyear, A.DX_GROUP, A.TOTALAPPNTS_NEW, A.TOTALAPPNTS_RETURN, cas lorsque b.totalappnts_new est null alors 0 autre ((((B.Totalappnts_new-a.totalappnts_new) /a.totalappnts_new) * 10 0 Fin pct de oncle .tTEMP_ORCM_Visits que A LEFT OUTER JOIN (SELECT b.FiscalYear, b.Dx_Group, b.TotalAppnts_NEW, b.TotalAppnts_RETURN de ONC.tTEMP_ORCM_Visits b) b = a.Dx_Group b.dx_group et a.FiscalYear = b.fiscalyear + 1


ohh dieu qui a l'air si mal que j'ai essayé de mettre chaque phrase de la déclaration de sélection sur une ligne différente


Depuis que vous obtenez 0, je suppose que b.totalappnts_new est null. Mais, vous voudrez peut-être inclure B.TotalappnTS_NEW comme une nouvelle colonne juste pour voir quelle est la valeur. Si la colonne B.TOTALAPPNTS_NEW est toujours nulle, vous voudrez peut-être me concentrer sur la sous-requête qui est aliasée à B. Juste avec un bref coup d'œil, votre requête semble aller bien.


Encore une fois, je suis désolé aussi me déranger, il y a quelques valeurs dans le totalAppnts_new qui sont nulles, mais sur près de 70 rangées de données seulement 7 ou 8 sont nulles toutes les valeurs de reposent.


Le problème peut être que la requête fait des mathématiques entier, où le résultat de la division d'un entier par un entier est un entier. Lorsque vous faites des mathématiques entier, 1/2 n'est pas de 0,5; C'est 0. J'ai inclus "1.0 *" dans ma réponse (1.0 * T1.C - T2.c) pour le forcer à flotter des mathématiques. Vous pouvez essayer ou ajouter une fonction moulée (par exemple, moulage (T1.c comme décimal (10, 2)). La distribution est probablement meilleure car elle est plus explicite.


Je déteste que je dois tout jeter c'est une chose que j'oublie toujours de faire. merci beaucoup d'homme cela a fonctionné parfaitement comment puis-je vous donner de crédit pour cela


Je suis content que cela fonctionnait. Vous pouvez cliquer sur UP-arrow pour voter toutes les réponses qui sont bonnes. Et, cliquez sur Cochez la case sur la réponse qui est votre choix le mieux.



0
votes

Vous pouvez aussi essayer cela aussi: xxx

voir Fiddle .

En supposant que vous avez déjà 0 en valeur par défaut pour D. sinon, définissez-la sur 0 pour toutes les lignes avant d'exécuter cette requête.


0 commentaires

2
votes

Vous pouvez y accomplir avec une jointure auto-jointe: xxx

exemple SQL Fiddle


4 commentaires

J'ai essayé de votre chemin et je continue à obtenir des 0 résultat pour la partie de calcul que j'ajoute le SQL que j'ai écrit pouvez-vous me faire savoir s'il y a quelque chose que je fais mal. Merci pour votre aide Select A.Fiscalyear, A.DX_GROUP, A.TOTALAPPNTS_NEW, A.TOTALAPPNTS_REURN, cas lorsque B.TOTALAppNTS_NEW n'est pas NULL et A.TOTALAppNTS_NEW n'est pas NULL ((B.TOTALAPPNTS_NEW-A.TOTALAPPNTS_NEW) / a. TOTALAppNTS_NEW) * 10 0 else 0 Fin pct de Onc.ttemp_orcm_visits en tant que jointure extérieure gauche Onc.ttemp_orcm_visits comme B sur A.DX_GROUP = B.DX_GROUP et A.Fiscalyear = B.Fiscalyear + 1


@ user2167857 Vos colonnes sont probablement des entiers et votre requête aboutira à une division entière, en supprimant la fraction (pourcentage). Remarque Mon Cast (comme numérique (5,2)) qui allumera le numérateur en une valeur numérique , permettant aux calculs de persister les valeurs de pourcentage que vous recherchez.


Wegner merci mec votre réponse de votre et Bob est presque exactement la même chose que j'apprécie toute l'aide.


@ user2167857 Vous êtes le bienvenu - Je suis content que vous ayez eu votre problème résolu.