繁体   English   中英

两列的总和,其中join和group by另一列

[英]Sum of two columns with join and group by another column

我的T-SQL查询需要帮助。 我想做的是以下几点:

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

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

注意:今年的销售额在名为“ Trans_ Sales Entry”的表中,而去年的销售额则存储在名为“ Archived Sales Entry”的表中

我也不想在查询中手动输入日期,而是希望有一个变量(例如“ Today”和“ Today” -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和存档表中每个存储都有多个行,这就是为什么我需要对所有行进行汇总并将它们在两个表中的每个存储进行分组的原因。

我怀疑您在反式和存档表中每个存储区都有超过1行。 如果是这样,那么您的查询注定会乘以结果,因为引擎首先将表联接在一起,从而创建同一商店的所有跨行和所有归档行的笛卡尔结果,然后对这些值求和。 因此,如果您一家商店有2个转换行和3个归档行,则在聚合之前将有6行...在聚合和加和之后,“销售额”将是预期的3倍,“去年”将是预期的2倍您对该商店的期望。

此查询应解决您的问题。

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表,并为每个商店添加一列作为Archived表中的总和计算的列... 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表中找到的所有商店。 第二个将仅列出在两个表中找到的商店。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM