【发布时间】: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