【问题标题】:Sum of two columns with join and group by another column由另一列连接和分组的两列的总和
【发布时间】:2014-05-17 05:19:30
【问题描述】:

我的 T-SQL 查询需要帮助。我正在尝试做的是以下内容:

在结果中,我希望在第二列中按Store no. 分组的一列我希望net Amount 的总和为Sales,第三列我希望它显示每个store no. 的去年销售额

+-------+--------+------------+
| Store | Sales  | Last Year  |
+-------+--------+------------+
|  401  | 20000  |   19000    |
|  402  | 25000  |   21000    |
|  403  | 10000  |   15000    |
+-------+--------+------------+

注意:今年的销售额在一个名为“Trans_Sales Entry”的表中,去年的销售额在一个名为“Archived Sales Entry”的表中

我也不想在查询中手动输入日期,我宁愿想要一个变量,例如(“今天”和“今天”-365)

这是正确的方法吗,还是有更好的方法?

SELECT
   "Company$Trans_ Sales Entry"."Store No_" AS "Store",
   SUM("Company$Trans_ Sales Entry"."Net Amount"*-1) AS "Sales",
   SUM("Company$Archived Sales Entry"."Net Amount"*-1) AS "Last Year"
FROM "Company$Trans_ Sales Entry"
JOIN "Company$Archived Sales Entry" ON
  "Company$Trans_ Sales Entry"."Store No_"="Company$Archived Sales Entry"."Store No_"
WHERE 
  "Company$Trans_ Sales Entry"."Date"='2014-05-16' AND
  "Company$Archived Sales Entry"."Date"='2013-05-16'
GROUP BY
  "Company$Trans_ Sales Entry"."Store No_",
  "Company$Archived Sales Entry"."Store No_"

当我执行这个查询时,我在“销售额”和“去年”中得到的数字太高了。我的查询有问题...希望有人能提供帮助!

如果我执行此操作,销售数字是正确的,但我没有包括去年列:

 Select 
     [Company$Trans_ Sales Entry].[Store No_] As Store, 
     Sum([Company$Trans_ Sales Entry].[Net Amount]) As Sales 
 From 
     [Company$Trans_ Sales Entry] 
 Where 
     [Company$Trans_ Sales Entry].Date = '2014-05-16' 
 Group By 
     [Company$Trans_ Sales Entry].[Store No_]

在 trans 和 archived 表中每个商店都有多行,这就是为什么我需要对所有行求和并在两个表中按商店对它们进行分组。

【问题讨论】:

  • 请将您的cmets直接合并到问题中,使其更完整和可读。由于这看起来像是 JOIN 的问题,因此您还应该包括要连接的表的结构。在 trans 和 archived 表中,每个商店的行数是否超过 1 行?如果是这样,那么您的查询注定会产生成倍的结果。
  • 感谢您的评论弗拉兹,我现在已经做到了。是的,两个表中每个商店都有多行...

标签: sql sql-server join group-by sum


【解决方案1】:

我怀疑您在 trans 和 archived 表中的每个商店都有超过 1 行。如果是这样,那么您的查询注定要乘以结果,因为引擎首先连接表,创建同一存储的所有跨行和所有存档行的笛卡尔结果,然后对这些值求和。因此,如果一个商店有 2 个跨行和 3 个存档行,那么在聚合之前您将获得 6 行......并且在聚合和求和之后,“销售额”将是您预期的 3 倍,而“去年”将是两倍你期望的(对于那家商店)。

这个查询应该可以解决你的问题。

SELECT
  "Store No_" AS "Store",
  SUM("Net Amount"*-1) AS "Sales",
  (SELECT SUM("Net Amount"*-1)
    FROM "Company$Archived Sales Entry"
    WHERE
      "Store No_"="Company$Trans_ Sales Entry"."Store No_" AND
      "Date"='2013-05-16'

  )  AS "Last Year"
FROM "Company$Trans_ Sales Entry"
WHERE "Date"='2014-05-16'
GROUP BY "Store No_"

它聚合和汇总存储中的 Trans 表,为每个存储添加一个计算为存档表上的总和的列...一个 SUBSELECT。

另一种方法是先对两张表进行聚合和求和,然后将结果加入存储中:

SELECT t.Store, Sales, "Last year"
FROM (SELECT "Store No_" AS "Store", SUM("Net Amount"*-1) AS "Sales"
      FROM "Company$Trans_ Sales Entry"
      WHERE "Date"='2014-05-16'
      GROUP BY "Store No_") t
JOIN (SELECT "Store No_" AS "Store", SUM("Net Amount"*-1) AS "Last year"
      FROM "Company$Archived Sales Entry"
      WHERE "Date"='2013-05-16'
      GROUP BY "Store No_") a
ON a.Store=t.Store
ORDER BY t.Store

请注意,如果 Trans 表和 Archived 表不包含所有相同的存储,则结果会有所不同。第一个将列出在 Trans 表中找到的所有商店。第二个将仅列出在两个表中找到的商店。

【讨论】:

  • 非常感谢!执行时出现错误:[错误代码:102,SQL 状态:42000] 'SUM' 附近的语法不正确。您还知道将日期 2013-05-16 更改为“Today-365”和 2014-05-16 更改为“today”的任何变量吗?
  • 有一个额外的 SUM。我删除了它。我还清理了一下,删除了不必要的表引用。我还添加了第二个解决方案。
  • 谢谢,我选择了第二种方法。它干净了很多,非常好!非常感谢你的帮助!!不幸的是,我无法投票赞成您的答案,因为它要求我拥有 15 名声望。哈哈不管那是什么意思..
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 2021-08-07
  • 2017-03-25
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2021-05-08
  • 2019-03-01
相关资源
最近更新 更多