【问题标题】:Is there a way to only return certain values if specific conditions are meet in a SQL query?如果在 SQL 查询中满足特定条件,有没有办法只返回某些值?
【发布时间】:2020-08-20 00:53:41
【问题描述】:

我正在尝试解决业务问题。数据库具有仓库和物料组分配的佣金率。但是,有时我们会按仓库、项目组和客户分配佣金。在大多数情况下,我只需要返回仓库和项目组的佣金,但是当有客户分配给特定佣金率时,我想返回该值而不是标准(仓库和项目组)。现在,我的查询返回两个佣金值,一个用于(仓库和商品组),另一个用于(仓库、商品组和客户)。理想情况下,我希望客户组覆盖仓库/项目组。

这是我得到的示例输出:

  | BizProp | WhsCode | ItmsGrpCod | ItemCode | CardCode | U_CardCode | Qty | TotSale | CommRate | Commission |
1 | 18      | 01      | 101        | 10034    | C10187   | NULL       | 856 | 1964.61 | 0.0300   | 25.68      |
2 | 18      | 01      | 101        | 10034    | C10291   | NULL       | 900 | 2088.00 | 0.0300   | 27.00      |
3 | 18      | 01      | 101        | 10034    | C10541   | NULL       | 405 | 991.85  | 0.0300   | 12.15      |
4 | 18      | 01      | 101        | 10034    | C10541   | C10541     | 405 | 991.85  | 0.0050   | 2.025      |
5 | 18      | 01      | 102        | 10001    | C10187   | NULL       | 335 | 852.44  | 0.0300   | 10.05      |
6 | 18      | 01      | 104        | 10052    | C10291   | NULL       | 5   | 51.25   | 0.2500   | 1.25       |

我希望查询仅返回第 4 行,因为它对该客户有特殊的佣金率,而不是第 3 行和第 4 行。这在 SQL 中是否可能?还是需要在 excel 或其他工具中进行一些数据转换?

这是我用来从临时表中提取数据、运行计算并对数据进行分组的 CTE 代码。我可以添加任何逻辑来实现上述结果吗?

;WITH SalesCommission_CTE AS
(
SELECT 
        BizProp,
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode,
        U_CardCode,
        SUM(Quantity) AS Quantity, 
        SUM(Price) AS Price, 
        MIN(U_CommRate) AS CommRate,
        COALESCE(SUM(Quantity * Price),NULL)  AS TotSales,  --Calc total sale amount per whs,itmgrp,cardcode
        COALESCE(SUM(Quantity * U_CommRate),NULL) AS Commission  --Calc commission rate per qty sold
FROM #TmpCustSaleRpt AS tcsr
GROUP BY 
        BizProp,            
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode
        ,U_CardCode
)
SELECT
        BizProp,
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode,
        U_CardCode,
        Quantity,  
        TotSales, 
        CommRate,
        Commission
FROM SalesCommission_CTE
    WHERE ItmsGrpCod NOT IN (109, 110, 111, 112, 114, 115, 116, 117, 118)
    ORDER BY
        BizProp,
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode
        ,U_CardCode

【问题讨论】:

  • 在 SQL 中一切皆有可能,但我仍然不明白您如何区分第 3 行和第 4 行?
  • 嗨@mohdatif,该名称位于 CardCode 和 U_CardCode 列上。在第 4 行,U_CardCode 值与表示该客户的特殊佣金率的 CardCode 值匹配。在第 3 行中,匹配项不存在,但 WhsCode 和 ItmGrpCod 与第 4 行相同。它本质上是重复行。
  • 您不能在选择中使用max(U_CardCode) 代替U_CardCode 吗?
  • @Twistleton 我不认为它会起作用,因为行不重复,并且在合并后您将再次获得两行,因为列 U_CardCode 是唯一的
  • @Twistleton 感谢您的意见。这似乎对我有用。 SELECT * FROM SalesCommission_CTE WHERE U_CardCode 不为 NULL UNION ALL SELECT * FROM SalesCommission_CTE2 AS cte2 WHERE AND U_CardCode 为 NULL 且不存在(SELECT * FROM SalesCommission_CTE AS cte1 WHERE cte2.CardCode = cte1.U_CardCode)

标签: sql


【解决方案1】:

我认为它应该适用于 Oracle 中的 Dense rank。如果可能,请您也提供示例数据。

;WITH SalesCommission_CTE AS
(
SELECT 
        BizProp,
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode,
        U_CardCode,
        SUM(Quantity) AS Quantity, 
        SUM(Price) AS Price, 
        MIN(U_CommRate) AS CommRate,
        COALESCE(SUM(Quantity * Price),NULL)  AS TotSales,  --Calc total sale amount per whs,itmgrp,cardcode
        COALESCE(SUM(Quantity * U_CommRate),NULL) AS Commission  --Calc commission rate per qty sold
FROM #TmpCustSaleRpt AS tcsr
GROUP BY 
        BizProp,            
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode
        ,U_CardCode
)
SELECT
        BizProp,
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode,
        U_CardCode,
        Quantity,  
        TotSales, 
        CommRate,
        max(Commission) keep (dense_rank first order by U_CardCode  desc null last) over (partition by CardCode ) commission
FROM SalesCommission_CTE
    WHERE ItmsGrpCod NOT IN (109, 110, 111, 112, 114, 115, 116, 117, 118)
    ORDER BY
        BizProp,
        WhsCode, 
        ItmsGrpCod, 
        ItemCode, 
        CardCode
        ,U_CardCode

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-05-12
  • 2020-02-17
  • 2020-10-05
  • 1970-01-01
  • 2021-12-23
  • 2022-11-29
  • 1970-01-01
  • 2020-01-05
相关资源
最近更新 更多