sql - 两列的总和,并按另一列进行连接和分组

标签 sql sql-server join group-by sum

我需要有关 T-SQL 查询的帮助。我想做的是:

在结果中,我想要一列按商店号分组,在第二列中,我想要净金额的总和作为销售额和第三列我希望它显示每个商店号去年的销售额。

+-------+--------+------------+
| 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 和存档表中每个商店都有多行,这就是为什么我需要对所有行进行求和并将它们分组到两个表中的每个商店。

最佳答案

我怀疑在 trans 和存档表中每个商店都有超过 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。

另一种方法是首先对 2 个表进行聚合和求和,然后将结果连接到存储上:

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 表中找到的所有商店。第二个将仅列出在两个表中找到的商店。

关于sql - 两列的总和,并按另一列进行连接和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23707872/

相关文章:

mysql - 如何在 MySQL 中正确使用 group by <<colName>>?

sql - 如何对每个项目的所有行求和?

mysql - 在一个表中使用联接

php - 从 Woocommerce 订单/WC_Order 对象获取订单备注?

php - 如何不让用户在mysql中保存相同的项目两次

java - Jenkins SQLServer 选择参数 - 从数据库中检索数据

sql - 当月和当年的特定日期

python - SQL Server 将 b'...' 添加到我存储的 jwt 标记中

Mysql 左连接不使用外键

php - 如何在跨三个表的 mysql 查询中使用联接