【发布时间】:2018-01-14 04:46:37
【问题描述】:
样本数据集:
+----------+---------+-----+
| order_id | prod_id | qty |
+----------+---------+-----+
| 1 | 1 | 2 |
| 1 | 1 | 4 |
| 1 | 3 | 1 |
| 2 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 4 | 1 |
| 3 | 4 | 2 |
| 3 | 2 | 3 |
| 3 | 3 | 5 |
| 4 | 1 | 2 |
| 4 | 2 | 3 |
| 4 | 3 | 3 |
| 4 | 4 | 3 |
| 4 | 6 | 2 |
+----------+---------+-----+
我要做的是构建一个“报告”视图,它将根据产品代码汇总某些总数。因此,例如,我想要一列包含产品代码 1 的订单总数,另一列包含产品 2 和 3 的总和,以及产品代码 4 和 6 的列。
请注意,产品代码的值来自产品类别表,因此我实际上希望获取第 1 类中的所有产品,即产品 1,然后是第 2 类中的所有产品,即产品2 和 3,然后是第 3 类中的所有产品,即产品 4 和 6。
+----------+--------+--------+--------+
| order_id | c1_tot | c2_tot | c3_tot |
+----------+--------+--------+--------+
| 1 | 6 | 1 | 0 |
| 2 | 1 | 2 | 0 |
| 3 | 0 | 8 | 3 |
| 4 | 2 | 6 | 5 |
+----------+--------+--------+--------+
我可以使用这样的 WHERE 子句为 一列 执行此操作:
SELECT
[order_id],
SUM([qty]) AS [c2]
FROM [orders]
WHERE [prod_id] IN (SELECT [id] FROM [product_class] WHERE [class] = 2)
GROUP BY [order_id]
我想出的另一种方法是存储函数,但这似乎是一种冗长的方法:
SELECT DISTINCT
[order_id],
total_products_by_class([order_id],1) AS [c1_tot],
total_products_by_class([order_id],2) AS [c2_tot],
total_products_by_class([order_id],3) AS [c3_tot]
FROM [orders]
我怀疑理论上可以用解析函数完成一些事情?...
有没有办法在适合视图的东西中不使用存储函数来做到这一点?
更新:更清楚需要从子查询中提取产品的值。
【问题讨论】:
-
您可以使用
CASE WHEN ... END语句来做您需要的事情。 -
好的,这是一个好的开始,但是我应该把
CASE语句放在哪里呢?我需要做类似CASE WHEN [prod_id] = 1 THEN SUM([qty]) ELSE 0 END AS [p1_tot]... 不,我认为这不会很快。 -
其他产品可以放
SUM(CASE WHEN prod_id = 1 THEN 1 ELSE 0) AS p1_tot等。 -
我尝试了这种方法
SUM(CASE WHEN [prod_id] IN (SELECT [id] FROM [prod_class] WHERE [class] = 1) THEN [qty] ELSE 0 END) AS [p2and3_tot],但得到了这个错误:Cannot perform an aggregate function on an expression containing an aggregate or a subquery. -
这行不通,因为我需要对数量值求和,而不是对记录数求和。
标签: sql sql-server tsql