MSSQL另一个表引用的值的总和

时间:2018-04-06 15:14:47

标签: sql sql-server tsql

我正在尝试创建一份关于每天花费总额的报告。 在数据库中有这两个表。它们使用创建时制作的“UID”进行匹配。

我已创建此查询,但会导致重复日期。

Select LEFT(f.timestamp, 10) timestamp, sum(s.Total) Total
FROM dbo.purchasing AS f
Join (SELECT uid,SUM(CONVERT(DECIMAL(18,2), (CONVERT(DECIMAL(18,4), qty) * price))) Total
        FROM dbo.purchasingitems
        GROUP BY uid)
AS s ON f.uid = s.uid
GROUP BY TIMESTAMP

购买:

+--+---------+------------+--------+---+
|ID|   UID   | timestamp  | contact|...|
+--+---------+------------+--------+---+
| 1|abr92nas9| 01/01/2018 | ROB    |...|
| 2|nsa93m187| 02/02/2018 | ROB    |...|
+--+---------+------------+--------+---+

purchasingitems:

+--+---------+-----+--------+---+
|ID|   UID   | QTY |  Price |...|
+--+---------+-----+--------+---+
| 1|abr92nas9|  20 | 0.2435 |...|
| 2|abr92nas9|  5  | 0.5    |...|
| 3|nsa93m187|  1  | 100    |...|
| 4|nsa93m187|  4  | 15.5   |...|
+--+---------+-----+--------+---+

2 个答案:

答案 0 :(得分:1)

您需要按表达式进行分组:

SELECT LEFT(f.timestamp, 10) as timestamp, sum(s.Total) as Total
FROM dbo.purchasing f JOIN
     (SELECT uid, SUM(CONVERT(DECIMAL(18,2), (CONVERT(DECIMAL(18,4), qty) * price))) as Total
      FROM dbo.purchasingitems
      GROUP BY uid
     ) s
     ON f.uid = s.uid
GROUP BY LEFT(f.timestamp, 10);

注意:

  • 您不应将日期/时间值存储为字符串(除非您有充分的理由)。如果timestamp是日期,则应使用cast(timestamp as date)
  • 您不应该在日期/时间使用字符串函数。
  • timestamp是SQL Server中的keyword(虽然没有保留),因此对于列名称来说不是一个好选择。
  • 您的问题是,您认为GROUP BY timestamp是指SELECT中的表达式。 SQL Server不支持列别名,因此它只能引用该名称的列。
  • 我没有看到为乘法转换为十进制的原因。你可能有充分的理由。
  • 您可能也需要order by,以确保结果集合理顺序。

答案 1 :(得分:0)

您发布的数据不会产生重复数据 没有理由进行子查询

Select LEFT(f.timestamp, 10) timestamp, 
       SUM(CONVERT(DECIMAL(18,2), (CONVERT(DECIMAL(18,4), s.qty) * s.price))) Total 
FROM dbo.purchasing AS f 
join dbo.purchasingitems s
  ON f.uid = s.uid
GROUP BY f.TIMESTAMP