上一年可用的联合表中的组信息

时间:2017-09-12 22:32:44

标签: sql ms-access

所以我这个表有一个唯一的标识符及其组;我希望根据其组

得到另一个表的总数

表1

UNIQUE_ID ! Group

      1     West 
      2     West 
      3     West 
      4     West 
      5     West 
      6     East 
      7     East 

然后我有第二张表加入

表2

UNIQUE_ID ! NET PROFIT ! ASSETS ! EQUITY ! YEAR

       1     100           100     100     2016  
       1     100           100     100     2015  
       2     100           100     100     2016 
       2     100           100     100     2015  
       3     100           100     100     2016  
       3     100           100     100     2015  
    ***4     10            10      10      2015*** 
       5     100           100     100     2016  
       5     100           100     100     2015   
    ***6     10            10      10      2014*** 
       7     100           100     100     2016  
       7     100           100     100     2015
       7     100           100     100     2014

我链接前面的表和我按组分组,然后给出了NEt利润,资产和权益的总和,问题是它总结了表2中的所有年份或者我做了2016年的年份和我仅从2016年获得总数,不包括ID为2015年或2014年最新年份的行

我需要它按组进行分组,并且只对每个唯一ID的最后一个可用年份求和,以便我得到下表

查询会给我这张表

Group ! NET PROFIT ! ASSETS ! EQUITY
 East      410        410      410
 West      110        110      110

任何人都可以帮助我吗?我到处寻找并尝试了许多组合但没有成功

3 个答案:

答案 0 :(得分:1)

这是你想要的吗?

SELECT Group_,
       SUM(NET_PROFIT) AS NET_PROFIT_YR,
       SUM(ASSETS) AS ASSETS_YR,
       SUM(EQUITY) As EQUITY_YR
  FROM Table1 AS T1
 INNER
  JOIN (SELECT T2_RAW.*
          FROM ( SELECT Unique_ID,
                        MAX(year) AS m_year
                   FROM Table2 AS T2
                  GROUP
                     BY Unique_ID
               ) AS MYR
         INNER
          JOIN Table2 AS T2_RAW
            ON MYR.unique_id = T2_RAW.unique_id
           AND MYR.m_year = T2_RAW.year
       ) AS TMP
    ON T1.unique_id = TMP.unique_id
 GROUP
    BY group_;

答案 1 :(得分:1)

予。完整的SQL语句:

SELECT 
    ta.group,
    SUM(IFNULL(tb.net_profit, 0)) as sumNetProfit,
    SUM(IFNULL(tb.assets, 0)) as sumAssets,
    SUM(IFNULL(tb.equity, 0)) as sumEquity
FROM table_a AS ta
LEFT JOIN (
    SELECT 
        unique_id,
        max(year) as maxYear
    FROM table_b
    GROUP BY unique_id
) AS tbMaxYears ON tbMaxYears.unique_id = ta.unique_id
LEFT JOIN table_b AS tb ON 
    tb.unique_id = ta.unique_id
    AND tb.year = tbMaxYears.maxYear
GROUP BY ta.group;

II。说明

内部查询:

SELECT 
    unique_id,
    max(year) as maxYear
FROM table_b
GROUP BY unique_id
  • unique_id中选择table_b,并为每个unique_id选择相应的最近年份,例如最大的一年;
  • unique_id;
  • 对提取的记录进行分组
  • 在别名LEFT JOIN下的maxYears语句中使用,其结果将由unique_id提取的table_a进行过滤。

内部查询结果如下所示:

unique_id   maxYear
-------------------
1           2016
2           2016
3           2016
4           2015
5           2016
6           2014
7           2016

外部查询:

SELECT 
    ta.group,
    SUM(IFNULL(tb.net_profit, 0)) as sumNetProfit,
    SUM(IFNULL(tb.assets, 0)) as sumAssets,
    SUM(IFNULL(tb.equity, 0)) as sumEquity
FROM table_a AS ta
LEFT JOIN (
    <THE-INNER-QUERY-RESULTS>
) AS tbMaxYears ON tbMaxYears.unique_id = ta.unique_id
LEFT JOIN table_b AS tb ON 
    tb.unique_id = ta.unique_id
    AND tb.year = tbMaxYears.maxYear
GROUP BY ta.group;
  • 读取所有table_a条记录;
  • 附加maxYears详细信息(通过内部查询获取);
  • 附加table_b详细信息;
  • group列分组记录;
  • 计算相应的总和(包括NULL值验证)。

外部查询的结果(例如最终结果):

group   sumNetProfit    sumAssets   sumEquity
---------------------------------------------
East    110             110         110
West    410             410         410

外部查询中的第二个LEFT JOIN:

LEFT JOIN table_b AS tb ON 
    tb.unique_id = ta.unique_id
    AND tb.year = tbMaxYears.maxYear
  • table_b详细信息附加(加入)从table_a获取的记录;
  • 仅附加了table_b条记录,这些记录与unique_id的相应unique_id值相同table_a并且(!)与year相同maxYear来自maxYears表的相应CREATE TABLE `table_a` ( `unique_id` int(11) DEFAULT NULL, `group` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `table_b` ( `unique_id` int(11) DEFAULT NULL, `net_profit` int(11) DEFAULT NULL, `assets` int(11) DEFAULT NULL, `equity` int(11) DEFAULT NULL, `year` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 值。

III。使用的表结构:

我使用了一个带有以下CREATE TABLE语法的MySQL数据库:

error: BadStatus { status = { code = 422, message = "Unprocessable Entity" }, headers = Dict.fromList [("cache-control","max-age=0, private, must-revalidate"),("content-type","application/json; charset=utf-8")], url = "http://localhost:4000/api/v1/sessions", body = "{\"error\":\"No user could be found\"}" }

我使用了和你一样的数据。

祝你好运!

答案 2 :(得分:1)

考虑将聚合派生表连接到其他两个表的连接,其中基本上最后INNER JOIN充当WHERE子句,以过滤每个 unique_id的选择年份

SELECT t1.`GROUP`, SUM(t2.NET_PROFIT) AS SUM_NET_PROFIT, 
                   SUM(t2.ASSETS) AS SUM_ASSETS, 
                   SUM(t2.EQUITY) AS SUM_EQUITY
FROM (`table2` t2
INNER JOIN `table1` t1
   ON t1.UNIQUE_ID = t2.UNIQUE_ID)       
INNER JOIN 
  (SELECT t2.UNIQUE_ID, MAX(t2.`YEAR`) AS MAX_YEAR
   FROM `table2` t2
   GROUP BY t2.UNIQUE_ID) g    
ON t2.`UNIQUE_ID` = g.`UNIQUE_ID` AND t2.`YEAR` = g.`MAX_YEAR`    
GROUP BY t1.`GROUP`;

请注意用于包装MS Access中所需的第一次表连接配对的括号。