2017-10-09 106 views
1

是否可以从计算列中的DAX中的不同长度的字符串中移除所有非数字字符?删除字符串中的所有数字字符DAX

该模型是模型,所以我无法在查询时使用M语言来清理数据。

此外,我想删除0开始的数字,但没有结束0

考虑下面输入一列:

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

而这正是我要找的

输出
1 
2 
3 
6 
2 
5 
5 
10 

回答

2

如果列宽是已知的,但不是太宽,可以使用这种方法。让我们假设你的字母和数字混合列称为[Letters And Numbers]

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

当然,如果你希望在列有多个号码这一问题变得更为复杂。

在这种情况下,很难用来使用DAX语言来做到这一点;你需要写类似:

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

除非你需要26层的替代品,除非你希望有更多或更少的非数字字符。

更好的是在编辑查询部分使用M.添加自定义列,定义如下:

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

如果您无法因为您正在使用直接查询到SSAS表格模型中使用M,则唯一的选择可能是修改SQL查询的负载将该表放入表格模型中以添加附加列。

有可能,可以做一些T-SQL的例子很多,这里是一个:

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

我更新了我的问题,你一言我注意到没有明确不够好回答的问题。 – uzr

+0

使用M编辑查询不是一个选项。在这种情况下,我正在使用带有直接查询的表格SSAS模型作为PowerBI的数据源。 – uzr

相关问题