如何格式化数字和访问交叉表查询以显示两个小数位?

时间:2014-12-21 20:13:34

标签: sql ms-access pivot

我有一个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    |

我已经能够配置“总里程数”'通过将格式和小数位数属性(在设计视图中)更改为"固定"和" 2,"分别。但是,确定“类”列中的值的查询列(在“设计视图”中)只有一个Format属性,我将其设置为" Fixed&#34 ;;我没有可以调整的小数位数属性。

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

这让我想知道问题是否是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并不总是保存这些属性设置。至少不是在我使用它们的上下文中。

1 个答案:

答案 0 :(得分: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引导我回答这个问题。