Mysql sql聚合函数上的多个条件
如何在sql聚合函数上按多个条件分组。例如,我有两个表Mysql sql聚合函数上的多个条件,mysql,Mysql,如何在sql聚合函数上按多个条件分组。例如,我有两个表Sales和Accounts ID | identifier_one | identifier_two | current_month | current_year 1 | 1 | A1 | 2 | 2 2 | 1 | B1 | 1 |
Sales
和Accounts
ID | identifier_one | identifier_two | current_month | current_year
1 | 1 | A1 | 2 | 2
2 | 1 | B1 | 1 | 1
销售
ID | identifier_one | identifier_two | quantity | date
1 | 1 | A1 | 1 | 2017-01-01
2 | 1 | B1 | 1 | 2017-01-01
3 | 1 | A1 | 1 | 2017-01-02
查询也应填充accounts表
账户
ID | identifier_one | identifier_two | current_month | current_year
1 | 1 | A1 | 2 | 2
2 | 1 | B1 | 1 | 1
我有这个查询,但它只考虑标识符\u one
,因此在本例中,账户中的两个条目都有3
和3
$sales = DB::select('SELECT
identifier_one,
SUM(IF(YEAR(`date`) = YEAR(CURDATE()), quantity, 0)) AS current_year,
SUM(IF(YEAR(`date`) = YEAR(CURDATE()) AND MONTH(`date`) = MONTH(CURDATE() ), quantity, 0)) AS current_month,
SUM(IF(YEAR(`date`) = YEAR(CURDATE()) - 1, quantity, 0)) AS last_year,
SUM(IF(YEAR(`date`) = YEAR(CURDATE()) AND MONTH(`date`) = MONTH(CURDATE()) - 1, quantity, 0)) AS last_month
FROM sales
GROUP BY identifier_one');
foreach ($sales as $sale) {
DB::table('accounts')
->where([
['identifier_one', '=', $sale->identifier_one]
])
->update([
'current_year' => $sale->current_year,
'current_month' => $sale->current_month,
'last_month' => $sale->last_month,
'last_year' => $sale->last_year
]);
}
似乎您只需要将a和字段名添加到group by。 如果where子句需要更新以考虑这两个标识符,您可能还需要将标识符_two添加到select中。(可能)
也许我遗漏了什么,只是一个逗号和字段名int eh group by<代码>按标识符1、标识符2分组,如果你想在选择中添加标识符2,我想在更新时说我应该添加到
where()
子句['identifier\u two','=',$sale->identifier\u two]
但总而言之,它似乎给所有3个都提供了相同的数量,我不明白这是怎么可能的。GROUP BY identifier_one,identifier_two
将确保为identifier_one和identifier_two的每个唯一配对计算总和。在这种情况下,您应该只返回2行我认为问题是我需要两个条件来匹配并返回销售行“因此,当标识符和标识符都相同时,将所有销售相加,然后给我每个”销售“我们说的是同一件事。1、A1和1、B1是唯一的配对。1,A1加起来等于2和1,B1等于1。如果你得到3,那么出于某种原因,group by没有被执行。