是否可以从计算列中DAX
的不同长度的字符串中删除所有非数字字符?
该模型是ssas-tabular模型,因此我无法在查询时使用M语言清理数据。
此外,我想删除起始0位数,但不是结束0。
在列中考虑以下输入:
C1
C2
C3
6F
2F
5Z
05F
A10
这是我正在寻找的输出
1
2
3
6
2
5
5
10
答案 0 :(得分: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;