Sql server 按产品子类别查找销售和退货的百分比。我只需要显示销售排名前5位的子类别

Sql server 按产品子类别查找销售和退货的百分比。我只需要显示销售排名前5位的子类别,sql-server,Sql Server,关于这一问题,我有两个表格,如下所示: 产品目录信息-此表包含以下列: 产品类别:它包含产品的类别名称 产品类别id:它包含产品的类别id。请注意,每个产品类别都分配了一个唯一的id。例如::假设我有以下产品类别书籍、体育、电子产品。因此,这3个产品类别将分别分配产品类别ID为1、2和3。 产品子类别:它包含产品的子类别 产品子类别id:它包含产品的子类别id 现在了解如何存储此产品子类别。 例如:假设产品类别书籍,我有3个产品子类别,如小说、教科书和小说。所以在这种情况下,每个产品子类别都会被

关于这一问题,我有两个表格,如下所示:

产品目录信息-此表包含以下列:

产品类别:它包含产品的类别名称 产品类别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%减去销售额百分比

你们能帮我解决这个问题吗

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
    ```