【问题标题】:sum 1 column and pick the date on another column对 1 列求和并在另一列中选择日期
【发布时间】:2015-01-30 08:13:07
【问题描述】:

我有一个有 2 列的表格:

date | points

数据:

2015-01-30 00:00:00.000  |    1.2
2015-01-29 00:00:00.000  |    2
2015-01-30 00:00:00.000  |    5
2015-01-27 00:00:00.000  |    7

我想根据datepoint 列求和。因此,如果我使用2015-01-30 00:00:00.000 过滤日期,那么结果将如下所示:

2015-01-30 00:00:00.000  |    7.5

上面的记录应该是这个样子。

我有一个查询,但它返回了

将数据类型 varchar 转换为 float 时出错。

我的 SQL 代码。

SELECT gpsdate, totkm
FROM (
  SELECT gpsdate,
     cast(cast(cast((SUM(KMRUN)) as float) as int) as nvarchar(50)) as totkm
     ,
     RANK() OVER(PARTITION BY gpsdate 
                 ORDER BY SUM(KMRUN) DESC) as R
 FROM view_tracklist_report
  GROUP BY gpsdate) as InnerQuery
 WHERE InnerQuery.R = 1

【问题讨论】:

  • points 列的类型是什么?是数字还是 varchar ?

标签: sql-server date datetime casting


【解决方案1】:

测试数据

CREATE TABLE #Test ([date] DATETIME, points FLOAT);

INSERT INTO #Test
    ([date], points)
VALUES
    ('2015-01-30 00:00:00.000', 1.2),
    ('2015-01-29 00:00:00.000', 2),
    ('2015-01-30 00:00:00.000', 5),
    ('2015-01-27 00:00:00.000', 7)

实际代码:不知道为什么总和应该是 7.5? 5+1.2=6.2

SELECT DISTINCT [date], SUM(points) OVER(PARTITION BY [date]) AS TotPoints
FROM #Test

【讨论】:

    【解决方案2】:

    只需按以下方式分组:

    Select gpsdate, Sum(CAST(KMRUN AS float)) as KMRUN
    From view_tracklist_report
    group BY gpsdate
    

    【讨论】:

    • Error converting data type varchar to float. 它返回此错误
    • KMRUN 的数据类型是什么?检查更新的声明
    • CAST 放在适当的位置可以解决问题。但是有更好的解决方案。看我的回答。
    【解决方案3】:

    这不是将数值存储为 varchars 的好选择。如果这样做,则必须在每个查询中将它们转换为数字。这不是最优的。

    所以你必须转换你的专栏 tu FLOAT。然后你可以简单地调用

    SUM(KMRUN)
    

    没有任何强制转换。

    现在您的 SUM(KMRUN) 正在连接字符串并给出类似的结果

    1.2257

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多