所以我这个表有一个唯一的标识符及其组;我希望根据其组
得到另一个表的总数表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
任何人都可以帮助我吗?我到处寻找并尝试了许多组合但没有成功
答案 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)
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;
内部查询:
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
列分组记录; 外部查询的结果(例如最终结果):
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;
值。我使用了一个带有以下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中所需的第一次表连接配对的括号。