2017-10-09 7 views
1

Est-il possible de supprimer tous les caractères non numériques d'une chaîne de longueur variable dans DAX dans une colonne calculée? Le modèle étant un modèle , je ne parviens pas à utiliser le langage M pour nettoyer les données au moment de la requête.Supprimer tous les caractères non numériques de la chaîne DAX

Je veux aussi supprimer à partir 0 chiffres, mais pas la fin 0.

Considérons l'entrée suivante dans une colonne:

C1 
C2 
C3 
6F 
2F 
5Z 
05F 
A10 

Et ceci est la sortie que je cherche

1 
2 
3 
6 
2 
5 
5 
10 

Répondre

2

Si la largeur de la colonne est connue, et pas trop large, vous pouvez utiliser cette approche. Supposons que votre colonne de lettres et de nombres fractionnaires est appelé [Letters And Numbers]:

Just The Numbers = IFERROR(VALUE(MID([Letters And Numbers], 1, 1)), IFERROR(VALUE(MID([Letters And Numbers], 2, 1)), BLANK())) 

Bien sûr, cela devient plus compliqué si vous attendez plus d'un numéro dans la colonne.

Dans ce cas, il serait très incommode d'utiliser le langage DAX pour le faire; vous aurez besoin d'écrire quelque chose comme:

Just The Numbers = SUBSTITUTE(SUBSTITUTE([Letters And Numbers], "A", ""), "B", "") 

sauf que vous auriez besoin 26 remplaçants, à moins que vous attendez plus ou moins de caractères non numériques.

Mieux vaut de loin utiliser M dans la section des requêtes d'édition. Ajouter une colonne personnalisée avec la définition suivante:

= Table.AddColumn(#"Previous Step", "Just The Numbers", each Text.Combine(List.RemoveItems(Text.ToList([Letters And Numbers]),{"A".."z"}))) 

Et si vous ne parvenez pas à utiliser M parce que vous utilisez requête directe à un modèle de tableau SSAS, la seule option est probablement modifier la requête SQL qui charge la table dans le modèle tabulaire pour ajouter une colonne supplémentaire.

Il y a probablement beaucoup d'exemples de certains T-SQL qui pourrait le faire, voici une:

USE AdventureWorksDW2012; 

WITH split AS (
    SELECT AddressLine1, v.number, character.c 
     FROM DimReseller AS r 
     JOIN master..spt_values AS v ON v.number BETWEEN 1 AND LEN(r.AddressLine1) 
     CROSS APPLY (VALUES(SUBSTRING(r.AddressLine1, v.number, 1))) AS character(c) 
     WHERE v.type = 'P' 
     AND character.c LIKE '[0-9]') 
SELECT AddressLine1, 
     output = (SELECT c 
        FROM split 
        WHERE r.AddressLine1 = split.AddressLine1 
        ORDER BY number ASC 
        FOR XML PATH, TYPE).value(N'.[1]', N'bigint') 
    FROM dbo.DimReseller AS r 
    GROUP BY AddressLine1; 
+0

Je mis à jour ma question, vous m'a fait remarquer la question n'a pas été précisé assez pour une bonne réponse. – uzr

+0

L'utilisation de M pour modifier la requête n'est pas une option. Dans ce cas, je suis en train d'utiliser un modèle SSAS tabulaire avec Direct Query comme source de données pour PowerBI. – uzr