Sql server 按产品子类别查找销售和退货的百分比。我只需要显示销售排名前5位的子类别
关于这一问题,我有两个表格,如下所示: 产品目录信息-此表包含以下列: 产品类别:它包含产品的类别名称 产品类别id:它包含产品的类别id。请注意,每个产品类别都分配了一个唯一的id。例如::假设我有以下产品类别书籍、体育、电子产品。因此,这3个产品类别将分别分配产品类别ID为1、2和3。 产品子类别:它包含产品的子类别 产品子类别id:它包含产品的子类别id 现在了解如何存储此产品子类别。 例如:假设产品类别书籍,我有3个产品子类别,如小说、教科书和小说。所以在这种情况下,每个产品子类别都会被分配一个ID,比如1,2,3等等 事务这是另一个具有以下列的表: 合计金额:包含交易发生时客户支付的金额。 数量:包含客户对特定产品的订购数量。 产品子类别id:它包含产品的子类别id 产品类别id:它包含产品的类别id。 Cust_ID:包含客户ID[此问题不相关列] 注:列数量可以包含正值和负值。 例如:如果数量为正值,则表示客户下了订单。 如果数量为负值,则表示客户已提出退货请求。在这种情况下,“总计金额”列中的值也将为负值 使用下面我写的查询,我可以很容易地找到销售方面的前5个产品子类别。 但我不知道如何按产品子类别计算销售和退货。虽然我觉得可以使用SELECT CASE WHEN语句以类似CASE total\u amt>0的方式实现,但这里我们可以将total\u amt列中的正值相加,乘以100,再除以total\u amt列中的总销售额 我们可以为退货做同样的事情,比如案例总金额<0,然后100%减去销售额百分比 你们能帮我解决这个问题吗Sql server 按产品子类别查找销售和退货的百分比。我只需要显示销售排名前5位的子类别,sql-server,Sql Server,关于这一问题,我有两个表格,如下所示: 产品目录信息-此表包含以下列: 产品类别:它包含产品的类别名称 产品类别id:它包含产品的类别id。请注意,每个产品类别都分配了一个唯一的id。例如::假设我有以下产品类别书籍、体育、电子产品。因此,这3个产品类别将分别分配产品类别ID为1、2和3。 产品子类别:它包含产品的子类别 产品子类别id:它包含产品的子类别id 现在了解如何存储此产品子类别。 例如:假设产品类别书籍,我有3个产品子类别,如小说、教科书和小说。所以在这种情况下,每个产品子类别都会被
select top 5 Round(SUM(cast(total_amt as float)),2) as total_sales,
P.prod_subcat
from Transactions as T
INNER JOIN prod_cat_info as P
ON T.prod_subcat_code = P.prod_sub_cat_code
where T.Qty > 0
group by P.prod_subcat
order by total_sales desc
注意,我使用了cast函数,因为列是varchar类型的。
此外,我还使用了T.Qty>0的位置,以便仅获得那些正值的总和。让我知道我在这方面的理解是否正确。你的逻辑是正确的。您可以像这样计算总销售额、收益和利润
select
[Subcategory] = P.prod_subcat,
[Sales] = Round(SUM(cast( case when T.Qty > 0 then total_amt else 0 end as float)),2) ,
[Returns] = Round(SUM(cast( case when T.Qty < 0 then total_amt else 0 end as float)),2) ,
[Profit] = Round(SUM(cast(total_amt as float)),2) ,
from Transactions as T
INNER JOIN prod_cat_info as P ON T.prod_subcat_code = P.prod_sub_cat_code
group by P.prod_subcat
鉴于回报的总金额为负值,只需将所有总金额相加,即可正确计算[利润]
select top 5
P.prod_subcat [Subcategory] ,
Round(SUM(cast( case when T.Qty > 0 then T.Qty else 0 end as float)),2)[Sales] ,
Round(SUM(cast( case when T.Qty < 0 then T.Qty else 0 end as float)),2) [Returns] ,
Round(SUM(cast( case when T.Qty > 0 then T.Qty else 0 end as float)),2)
- Round(SUM(cast( case when T.Qty < 0 then T.Qty else 0 end as float)),2)[total_qty],
((Round(SUM(cast( case when T.Qty < 0 then T.Qty else 0 end as float)),2))/
(Round(SUM(cast( case when T.Qty > 0 then T.Qty else 0 end as float)),2)
- Round(SUM(cast( case when T.Qty < 0 then T.Qty else 0 end as float)),2)))*100[%_Returs],
((Round(SUM(cast( case when T.Qty > 0 then T.Qty else 0 end as float)),2))/
(Round(SUM(cast( case when T.Qty > 0 then T.Qty else 0 end as float)),2)
- Round(SUM(cast( case when T.Qty < 0 then T.Qty else 0 end as float)),2)))*100[%_sales]
from tbl_Tran as T
INNER JOIN prod_cat_info as P ON T.prod_subcat_code = P.prod_sub_cat_code
group by P.prod_subcat
order by [%_sales] desc
--USE Transactions at tbl_Tran
--sales,
--returns,
--Total_qty=sale-returns ---- i am using -ve becoz returns in already in -ve
--%sale=(sales/total_qty)*100
--similar for % of returns
```