【问题标题】:INNER JOIN Multiple tables - accessINNER JOIN 多个表 - 访问
【发布时间】:2021-01-26 22:08:06
【问题描述】:

我在这里是因为我在查询一个堆栈。

我有一张这样的桌子,叫做 t :

Order_ID
Product_ID  
Quantity
Discount
Revenue
Cost
Year
Supplier_ID
Customer_ID
Employee_ID  

从这个查询中我想获得类似的东西:

Product_ID
Quantities_ordered_2013
Tot_Revenue_2013
Quantities_ordered_2014
Tot_Revenue_2014
Quantities_ordered_2015
Tot_Revenue_2015

我创建了 3 个子查询来按每年的产品信息分组,如下所示:

   SELECT t.FK_Product_ID, Count(t.FK_Order_ID) AS Orders_2013, Sum(t.Revenue) AS Revenue_2013
FROM t
WHERE (((t.Year)=2013))
GROUP BY t.FK_Product_ID AS 2013_Product

创建 3 个表后,如何将它们合并在一起以获得我的表?

【问题讨论】:

  • 您的查询有什么问题?
  • 解释“合并”。请通过编辑而不是 cmets 进行澄清。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: sql ms-access join subquery


【解决方案1】:

考虑条件聚合,将WHERE 条件移动到IIF() 表达式中,以便与COUNT 和SUM 进行聚合。无需加入。此外,使用表别名来避免重复长表名(最好不要以数字或特殊字符开头)。

SELECT t.FK_Product_ID AS Product 
       , SUM(IIF(t.[Year]=2013, 1, 0) AS Orders_2013
       , SUM(IIF(t.[Year]=2013, Revenue, 0) AS Revenue_2013
       , SUM(IIF(t.[Year]=2014, 1, 0) AS Orders_2014
       , SUM(IIF(t.[Year]=2014, Revenue, 0) AS Revenue_2014
       , SUM(IIF(t.[Year]=2015, 1, 0) AS Orders_2015
       , SUM(IIF(t.[Year]=2015, Revenue, 0) AS Revenue_2015
FROM 12_A1_Q3_01_Denormalized t
GROUP BY t.FK_Product_ID 

或者,MS Access 维护唯一的cross tab query。但是,由于这个特殊查询一次只旋转一个聚合,因此您需要在最后连接多个底层查询:

TRANSFORM COUNT(*) AS Orders
SELECT t.FK_Product_ID AS Product 
FROM 12_A1_Q3_01_Denormalized t
GROUP BY t.FK_Product_ID 
PIVOT t.[Year] IN ([2013], [2014], [2015])
TRANSFORM SUM(t.[Revenue]) AS Revenue
SELECT t.FK_Product_ID AS Product 
FROM 12_A1_Q3_01_Denormalized t
GROUP BY t.FK_Product_ID 
PIVOT t.[Year] IN ([2013], [2014], [2015])
SELECT t.FK_Product_ID AS Product
       , o.[2013] AS Orders_2013
       , r.[2013] AS Revenue_2013 
       , o.[2014] AS Orders_2014
       , r.[2014] AS Revenue_2014 
       , o.[2015] AS Orders_2015
       , r.[2015] AS Revenue_2015 

FROM OrdersCrossTabQuery o
INNER JOIN RevenueCrossTabQuery r
   ON o.[Product] = r.[Product]

【讨论】:

  • 太棒了!我觉得好像我学到了新东西!谢谢!
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-03-03
  • 2014-01-22
  • 2023-04-06
相关资源
最近更新 更多