J'ai une table qui contient 32 colonnes dans une table Oracle.Comptage de colonnes non nulles d'une manière plutôt étrange
- Deux de ces colonnes sont des colonnes d'identité
- le repos sont des valeurs
Je voudrais obtenir la moyenne de toutes les colonnes de valeur, qui est compliquée par les colonnes null (identité). Ci-dessous le pseudo-code pour ce que je suis en train de réaliser:
SELECT
((nvl(val0, 0) + nvl(val1, 0) + ... nvl(valn, 0))
/nonZero_Column_Count_In_This_Row)
tel que: nonZero_Column_Count_In_This_Row = (ifNullThenZeroElse1 (val0) + ifNullThenZeroElse1 (val1) ... ifNullThenZeroElse (valn))
La difficulté ici est bien sûr en obtenant 1 pour toute colonne non nulle. Il semble que j'ai besoin d'une fonction similaire à NVL, mais avec une clause else. Quelque chose qui retournera 0 si la valeur est nulle, mais 1 sinon, plutôt que la valeur elle-même.
Comment dois-je procéder pour obtenir la valeur du dénominateur?
PS: Je sens que je dois expliquer une certaine motivation derrière cette conception. Idéalement, cette table aurait été organisée comme les colonnes d'identité et une valeur par ligne avec un identifiant pour la ligne elle-même. Cela l'aurait rendu plus normalisé et la solution à ce problème aurait été assez simple. Les raisons pour lesquelles cela ne doit pas être fait sont le débit et l'économie d'espace. C'est un énorme DB où nous insérons 10 millions de valeurs par minute. Faire chacune de ces valeurs une rangée signifierait 10M lignes par minute, ce qui n'est certainement pas réalisable. En emballant 30 d'entre eux dans une seule rangée, on réduit le nombre de lignes insérées dans quelque chose que l'on peut faire avec un seul DB, et la quantité de données supplémentaires (les données d'identité) beaucoup moins.
Salut Aaron, Le seul problème est, cette traite une valeur de zéro et NULL même. En fait, je veux ajouter une valeur de 0 au dénominateur, mais pas la valeur nulle. Merci. –