tsql - 在使用 CASE 输出值的 T-SQL 语句中计算 SUM
问题描述
我有一张表格,其中包含在电子商务网站上购买的订单,第二张表格详细说明了每个订单的产品(基本上是订单项)。我的职责是计算按产品分组的每个订购产品的总成本和总重量。店主希望能够通过重量或价值来识别销售最多的产品。
两张表的结构是这样的:
命令
id
orderDate
订单行
id
orderId
productNodeId
productName
quantity
duration
frequency
subscription
unitPrice
unitWeight
虽然一些订单行是简单的一次性产品(因此很容易计算总计,即总重量quantity * unitWeight
和总成本将是quantity * unitCost
)其他订单行是订阅,其中总重量将由总重量(duration/frequency) * unitWeight
计算成本将是(duration/frequency) * unitCost
。
我有以下 T-SQL 语句,它使用 CASE 返回总值(在 SQL Server 2008R2 Express 中运行):
SELECT
productNodeId AS id,
productName AS name,
quantity,
duration,
frequency,
subscription,
unitPrice,
CASE
WHEN subscription = 1 THEN unitWeight*(duration/frequency)
ELSE
unitWeight*quantity
END AS weight,
CASE
WHEN subscription = 1 THEN unitPrice*(duration/frequency)
ELSE
unitPrice*quantity
END AS total
FROM Order INNER JOIN OrderLine ON Order.id = OrderLine.orderId WHERE orderStatusId = 3
--GROUP BY productNodeId
ORDER BY total DESC
这在一定程度上有效。它输出以下值:
id | name | quantity | duration | frequency | subscription | unitPrice | weight | total
1105 Option C 1 24 1 1 2.50 18000 60.00
1105 Option C 1 24 2 1 2.50 9000 30.00
1104 Option B 1 24 2 1 2.50 9000 30.00
1105 Option C 1 24 2 1 2.50 10800 30.00
1105 Option C 1 4 1 1 2.50 2000 10.00
1107 Option A 1 0 0 0 2.80 600 2.80
1107 Option A 1 0 0 0 2.80 600 2.80
1121 Option D 1 0 0 0 2.80 400 2.80
最后一部分是对总数求和。但是,我不能只实现GROUP BY productNodeId
上面代码中注释掉的语句,因为它需要subscription
聚合字段,这否定了条件weight
和total
逻辑。
我想知道是否有人可以建议如何让它工作,以便我可以返回正确的重量和价格总数?
非常感谢。
解决方案
我无法对此进行测试,但您应该能够对原始查询进行子查询,并按逻辑将您的组应用于总字段,从而保持您的条件完好无损。
select id,name,quantity,duration,frequency,subscription,unitprice,weight,sum(total) as sumedtotal
from (
SELECT
productNodeId AS id,
productName AS name,
quantity,
duration,
frequency,
subscription,
unitPrice,
CASE
WHEN subscription = 1 THEN unitWeight*(duration/frequency)
ELSE
unitWeight*quantity
END AS weight,
CASE
WHEN subscription = 1 THEN unitPrice*(duration/frequency)
ELSE
unitPrice*quantity
END AS total
FROM Order INNER JOIN OrderLine ON Order.id = OrderLine.orderId WHERE orderStatusId = 3
--GROUP BY productNodeId
) as x
group by id,name,quantity,duration,frequency,subscription,unitprice,weight
推荐阅读
- search - 如何过滤axios得到结果
- vue.js - 如何修复 vue-router 的未知元素(例如 router-view、router-link)?
- r - rowsum 中的“组”参数如何工作?
- c# - 如何使用剃刀在选择中显示目录文件?
- javascript - 如何在不使用类的情况下创建具有公开方法的对象实例化?
- python - Python解释器忽略IF - ELIF语句
- ios - 我正在尝试使用图像幻灯片放映 cocoapods,页面指示器仅在我的项目中无法正常工作,但在演示和新项目中运行良好
- javascript - 如何在不触发“window.onunload”的情况下关闭窗口?
- node.js - 如何使用异步函数修复“意外令牌”错误
- java - 如果改造多个调用返回您需要的内容,如何只通知用户一次?