【问题标题】:How do I format numbers in and Access crosstab query to show two decimal places?如何格式化数字并访问交叉表查询以显示两位小数?
【发布时间】:2014-12-21 20:13:33
【问题描述】:

我有一个显示以下结果的 Access 交叉表查询:

| SHORE_TYPE  | Total Miles | Class 1           | Class 2          | Class 4 |
| ONSHORE     | 31.37       | 0.337121212121212 | 12.4617424242424 | 0       |

我希望它改为显示以下结果。请注意,此处的“类”列显示两位小数:

| SHORE_TYPE  | Total Miles | Class 1 | Class 2 | Class 4 |
| ONSHORE     | 31.37       | 0.34    | 12.46   | 0.00    |

我已经能够通过将 Format 和 Decimal Places 属性(在设计视图中)分别更改为“Fixed”和“2”来配置“Total Miles”列。但是,确定 Class 列中的值的查询列(在设计视图中)只有一个 Format 属性,我将其设置为“Fixed”;没有可供我调整的 Decimal Places 属性。

我有一些类似的交叉表查询以我想要的方式显示结果,但我无法确定这个和那些之间的任何差异。此外,我有时会看到我的一些查询一次以错误的方式显示它,然后在下一次以所需的方式显示。

这让我想知道问题是否是 Access 中的错误,或者我的代码中是否存在我应该明确定义的隐含定义。

这是我的 SQL:

TRANSFORM IIf(IsNull(Sum([qryPartL].[MILES_OF_PHYS_LENGTH])),0,
Sum([qryPartL].[MILES_OF_PHYS_LENGTH])) AS SumOfMILES_OF_PHYS_LENGTH
SELECT qryPartL.SHORE_TYPE, Sum(qryPartL.MILES_OF_PHYS_LENGTH) AS [Total Miles]
FROM qryPartL
GROUP BY qryPartL.SHORE_TYPE
PIVOT qryPartL.CLASS_LOC_text In ("Class 1","Class 2","Class 4");

编辑: 关闭并重新打开此查询后,Total Miles 列现在显示 31.3714015...,而我之前在设计视图中为此列设置的属性现在为空白。因此,看起来 Access 并没有始终如一地保存这些属性设置。至少不是在我使用它们的环境中。

【问题讨论】:

  • 您可以使用ROUND() 函数吗?看起来您想要将 Class 4 转换为小数
  • 我对使用 ROUND() 持怀疑态度,因为我的数字需要尽可能精确并且在我的所有查询和报告中保持一致。根据one source,“Round 函数的行为有点特殊...... Round 函数使用舍入到偶数的逻辑。如果您要舍入的表达式以 5 结尾,Round 函数将对表达式进行舍入,以便最后一位是偶数......如果这是所需的结果,请确保仅使用 Round 函数。”关于“convert(ing) Class 4 to a decimal”,你有什么建议?
  • 嗯...您可以使用 CCur 转换为 Currency,然后使用 CDbl 转换为 Double。您是否测试过/发现了任何不准确之处?
  • @Invent:在我的代码中,你会建议我这样做吗?请考虑添加常规答案。
  • 您可以参考 Excel 对象库并使用 Excel.WorksheetFunction.Round( ###,2),如果您喜欢它的表现更好。

标签: sql ms-access pivot


【解决方案1】:

诀窍是使用一系列嵌套函数。

  • CDbl:将数据转换为双数数据类型
  • FormatNumber:返回格式为具有指定精度 (2) 的数字的表达式
  • Nz: 字段为空时返回指定值(0)
    • 如果值为 Null,CDbl 函数将不起作用。

我还从 TRANSFORM 子句中删除了 IIf 函数,因为 Nz 在这种情况下效果更好。

这是返回所需结果的新 SQL。 (我添加了新的行和缩进以使其更易于阅读。这不是必需的步骤,实际上可能不会被 Access 记住。)

TRANSFORM 

 CDbl(
    FormatNumber(
         Nz(
             Sum([qryPartL].[MILES_OF_PHYS_LENGTH])
         ,0)
     ,2)
 ) AS SumOfMILES_OF_PHYS_LENGTH

SELECT qryPartL.SHORE_TYPE, 

 CDbl(
    FormatNumber(
         Nz(
             Sum(qryPartL.MILES_OF_PHYS_LENGTH)
         ,0)
     ,2)
 ) AS [Total Miles]

FROM qryPartL
GROUP BY qryPartL.SHORE_TYPE
PIVOT qryPartL.CLASS_LOC_text In ("Class 1","Class 2","Class 4");

感谢 Allen Browne 和 a tip on his awesome Access website 引导我回答这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2011-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多