【问题标题】:Data type for SQL aggregate functions (COUNT, SUM, AVG)SQL 聚合函数的数据类型(COUNT、SUM、AVG)
【发布时间】:2021-03-03 13:06:22
【问题描述】:

SQL 新手。假设我运行这个查询:

SELECT COUNT(SupplierID) AS "TotalSuppliers"
FROM Products;

这将返回一个包含名为“TotalSuppliers”的字段的单行。在我的数据库中,结果是“778”。

在 C# 中使用 typeof 进行测试时,该字段的类型为 short(ODBC SMALLINT 或 OleDB SmallInt 数据类型)。这与SupplierID 列的数据类型匹配。

我是否可以控制用于别名/临时列的类型?例如,是否可以在 ODBC SMALLINT 列上运行 COUNTSUM 并在输出中使用 INTEGERDOUBLE 数据类型?

【问题讨论】:

  • SupplierID 数据类型对于 count() 结果数据类型没有重要性。它是返回的行数,无论该列是数字、时间戳、字符等。
  • 但是,SUM 和 AVG 将具有基于输入列的数据类型。

标签: sql odbc oledb


【解决方案1】:

您可以在查询中转换:

select cast(count(*) as double) as TotalSuppliers

但是,这是数据库中的类型。 ODBC 仍负责转换为您的应用程序类型。

注意:在大多数数据库中,count(*) 应该返回一个 int——通常是 4 个字节。我想知道在您的系统上smallint 是否真的是 4 个字节。

【讨论】:

  • 感谢 Gordon,一如既往的快。准确的语法是什么?我试过SELECT CAST(COUNT(SupplierID) AS DOUBLE) AS "TotalSuppliers") FROM Products;,但没有返回任何数据。
  • @AlainD 。 . .您评论中的代码有多余的)
  • 啊,好地方...但是当我纠正它时仍然没有数据。不知道这可能是相关的,但我正在使用 MS Access 和 Jet 引擎。通过简短的 Internet 搜索,CAST 似乎特定于 SQL Server。
  • @AlainD 。 . .没有。CAST() 是标准 SQL。您需要为 MS Access 使用适当的定制功能。在我看来,它实际上只是几乎没有 SQL,缺少很多常见的标准 SQL 功能。
  • 找到了!它的CInt 用于“Int16”,CLng 用于“Int32”,CDbl 用于“double”(以及其他一些)。完整语法为SELECT CDbl(COUNT(SupplierID)) AS "TotalSuppliers" FROM Products;。谢谢戈登!必须承认,这很丑陋,并促使我尽可能将数据库升级到更符合 SQL 的东西。我应该编辑答案以包含有关CIntCDbl 的详细信息吗?
【解决方案2】:

如果您只是运行查询,则可以按照 Gordon 的建议转换结果。

如果您需要存储表中的列,您可以创建一个表并将 COUNT 或 SUM 的值插入到表中的 ODBC SMALLINT 列并使用 INTEGER 或 DOUBLE 数据类型。

使用您为其分配的别名/临时值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2020-08-05
    • 2013-08-14
    • 2018-06-27
    • 1970-01-01
    • 2014-02-24
    • 2010-11-24
    相关资源
    最近更新 更多