我如何聚合引用另一个 table 的 2 列的数据,并获得过去 3 个月的每月总计?
How do i aggregate data from 2 columns referencing another table and also get the monthly totals for the past 3 months?
使用以下数据:
如何根据listofincidents
[=33=中的两列(crime_incidentid、similar_incidentid)得到每个事件的成本总和]?
另外,如何获取过去 3 个月(1 月、2 月和 3 月)的总和?
create table crimeincidents (
id int not null,
name varchar(20),
primary key (id)
);
create table listofincidents (
id int not null,
incidentdate datetime not null,
crime_incidentid int not null,
similar_incidentid int not null,
cost_to_city decimal(8,2),
primary key (id),
FOREIGN KEY (crime_incidentid) REFERENCES crimeincidents(id),
FOREIGN KEY (similar_incidentid) REFERENCES crimeincidents(id)
);
insert into crimeincidents (id,name) values
(1,'Burglary'),
(2,'Theft'),
(3,'Grand theft auto');
insert into listofincidents (id, incidentdate, crime_incidentid,
similar_incidentid, cost_to_city)
values
(1, "2018-01-10 18:48:00", 1, 2, 900),
(2, "2018-02-15 14:48:00", 2, 3, 800),
(3, "2018-02-20 18:10:00", 3, 1, 1500.10),
(4, "2018-03-20 18:48:00", 1, 3, 800.23),
(5, "2018-03-25 18:24:00", 1, 3, 200.00),
(6, "2018-04-15 10:12:00", 1, 2, 400.00);
生成没有每月日期的结果的查询是:
select c.id, c.name, sm.similarIncidentCost, cr.crimeIncidentCost
from crimeincidents c
inner join (
select c.id, sum(s.cost_to_city) similarIncidentCost
from crimeincidents c inner join listofincidents s
on s.similar_incidentid = c.id
group by c.id
) sm on sm.id = c.id
inner join (
select c.id, sum(cr.cost_to_city) crimeIncidentCost
from crimeincidents c inner join listofincidents cr
on cr.crime_incidentid = c.id
group by c.id
) cr on cr.id = c.id;
我想使用过去 3 个月的数据生成成本。最终结果应如下所示:
1. January | 1500.1 | 1900.23
2. February | 900 | 800
3. March | 1800.23 | 1500.1
我认为这就是您的要求:
SELECT DATE_FORMAT(li.incidentdate, '%Y-%m') as date,
ci.name,
SUM(
li.cost_to_city
) as totalCost
FROM crimeincidents ci
JOIN listofincidents li ON ci.id = li.crime_incidentid OR ci.id = li.similar_incidentid
GROUP BY date, ci.id
ORDER BY date
你可以选择:
SELECT CONCAT(YEAR(li.incidentdate), ' ', MONTHNAME(li.incidentdate)) as month,
ci.name,
SUM(
li.cost_to_city
) as totalCost
FROM crimeincidents ci
JOIN listofincidents li ON ci.id = li.crime_incidentid OR ci.id = li.similar_incidentid
GROUP BY month, ci.id
ORDER BY month
为了更好地满足您的要求。
一开始没注意到您要将 "incident" 和 "similar incident" 的和分开。虽然我觉得很奇怪(因为类似的事件他自己也有类似的事件)我做了查询:
SELECT CONCAT(YEAR(li.incidentdate), ' ', MONTHNAME(li.incidentdate)) as month,
ci.name,
SUM(
IF(ci.id = li.id, li.cost_to_city,0)
) as totalCostIncident,
SUM(
IF(ci.id = li.similar_incidentid, li.cost_to_city,0)
) as totalCostSimilarIncident
FROM crimeincidents ci
JOIN listofincidents li ON ci.id = li.crime_incidentid OR ci.id = li.similar_incidentid
GROUP BY month, ci.id
ORDER BY month
使用以下数据:
如何根据
listofincidents
[=33=中的两列(crime_incidentid、similar_incidentid)得到每个事件的成本总和]?另外,如何获取过去 3 个月(1 月、2 月和 3 月)的总和?
create table crimeincidents ( id int not null, name varchar(20), primary key (id) ); create table listofincidents ( id int not null, incidentdate datetime not null, crime_incidentid int not null, similar_incidentid int not null, cost_to_city decimal(8,2), primary key (id), FOREIGN KEY (crime_incidentid) REFERENCES crimeincidents(id), FOREIGN KEY (similar_incidentid) REFERENCES crimeincidents(id) ); insert into crimeincidents (id,name) values (1,'Burglary'), (2,'Theft'), (3,'Grand theft auto'); insert into listofincidents (id, incidentdate, crime_incidentid, similar_incidentid, cost_to_city) values (1, "2018-01-10 18:48:00", 1, 2, 900), (2, "2018-02-15 14:48:00", 2, 3, 800), (3, "2018-02-20 18:10:00", 3, 1, 1500.10), (4, "2018-03-20 18:48:00", 1, 3, 800.23), (5, "2018-03-25 18:24:00", 1, 3, 200.00), (6, "2018-04-15 10:12:00", 1, 2, 400.00);
生成没有每月日期的结果的查询是:
select c.id, c.name, sm.similarIncidentCost, cr.crimeIncidentCost
from crimeincidents c
inner join (
select c.id, sum(s.cost_to_city) similarIncidentCost
from crimeincidents c inner join listofincidents s
on s.similar_incidentid = c.id
group by c.id
) sm on sm.id = c.id
inner join (
select c.id, sum(cr.cost_to_city) crimeIncidentCost
from crimeincidents c inner join listofincidents cr
on cr.crime_incidentid = c.id
group by c.id
) cr on cr.id = c.id;
我想使用过去 3 个月的数据生成成本。最终结果应如下所示:
1. January | 1500.1 | 1900.23
2. February | 900 | 800
3. March | 1800.23 | 1500.1
我认为这就是您的要求:
SELECT DATE_FORMAT(li.incidentdate, '%Y-%m') as date,
ci.name,
SUM(
li.cost_to_city
) as totalCost
FROM crimeincidents ci
JOIN listofincidents li ON ci.id = li.crime_incidentid OR ci.id = li.similar_incidentid
GROUP BY date, ci.id
ORDER BY date
你可以选择:
SELECT CONCAT(YEAR(li.incidentdate), ' ', MONTHNAME(li.incidentdate)) as month,
ci.name,
SUM(
li.cost_to_city
) as totalCost
FROM crimeincidents ci
JOIN listofincidents li ON ci.id = li.crime_incidentid OR ci.id = li.similar_incidentid
GROUP BY month, ci.id
ORDER BY month
为了更好地满足您的要求。
一开始没注意到您要将 "incident" 和 "similar incident" 的和分开。虽然我觉得很奇怪(因为类似的事件他自己也有类似的事件)我做了查询:
SELECT CONCAT(YEAR(li.incidentdate), ' ', MONTHNAME(li.incidentdate)) as month,
ci.name,
SUM(
IF(ci.id = li.id, li.cost_to_city,0)
) as totalCostIncident,
SUM(
IF(ci.id = li.similar_incidentid, li.cost_to_city,0)
) as totalCostSimilarIncident
FROM crimeincidents ci
JOIN listofincidents li ON ci.id = li.crime_incidentid OR ci.id = li.similar_incidentid
GROUP BY month, ci.id
ORDER BY month