我有这张表item_log
:
fk_i_item_id产品金额货币状态
$sales = $conn->osc_dbFetchResult("SELECT COUNT(status) FROM %st_item_log WHERE fk_i_item_id = '%s' AND status = 'COMPLETED'", DB_TABLE_PREFIX,osc_logged_user_id());
echo $sales['COUNT(status)']
我想在同一回音中计算产品的总销售数量。
前
***********************************************************
fk_i_item_id product amount currency status
***********************************************************
20 Book 1 10 USD COMPLETED
21 Book 2 12 USD COMPLETED
20 Book 1 10 USD COMPLETED
23 Book 3 11 USD COMPLETED
我想要一个查询来计算数字或记录。
*******************************************************************
fk_i_item_id product amount currency status Sales
*******************************************************************
20 Book 1 10 USD COMPLETED 2
21 Book 2 12 USD COMPLETED 1
23 Book 3 11 USD COMPLETED 1
答案 0 :(得分:1)
您似乎知道如何使用count()
之类的聚合函数,尽管在整个表格中。
也可以在表中的行组上使用这些聚合函数。例如,要获取每个项目ID的行数,这很简单:
select item_id,
count(*)
from some_table
group by item_id
所以你真正需要做的是使用group by
来指定更精细的分组级别,因为如果没有它,它将分组所有所选行。
关于你想要的输出,它可能可能更有意义地总和金额(因此id 20的数量为20而不是10)尽管这很可能因事实而复杂化您似乎允许多种货币。
我不会告诉你如何解决这个问题,除了说明你可能需要在汇总之前将金额转换为基准货币。
所以,作为第一个剪辑,我会看到类似的东西:
select fk_i_item_id,
max(product) as product,
sum(amount) as amount,
max(currency) as currency,
max(status) as status,
count(*) as sales
from st_item_log
where status = 'COMPLETED'
group by fk_i_item_id
请注意在您未分组的字段上使用“虚拟”max
聚合函数。这是为了确保行仍然在项目ID上进行分组,即使,如果它们具有不同的产品描述,货币或状态值(尽管根据where
子句,最后一个是不可能的)。 / p>