我的任务是为今天早上发现的问题提出解决方案。我有一个查询,我需要做一些数学计算。我有三个相关的专栏。
SELECT lQ.[QUANTITY], lQ.[FORM_FACTOR_ID], oQ.[INDIVIDUAL_PACKAGING]
FROM [dbo].[AOF_ORDER_LINE_QUEUE] as lQ
LEFT JOIN [dbo].[AOF_ORDER_QUEUE] AS oQ
ON lQ.[SALES_ORDER_NUMBER] = oQ.[SALES_ORDER_NUMBER]
我可以看到自己在一个循环中以我最熟悉的语言轻松地做到这一点。基于一些初步研究,在SQL中做循环似乎并不是一件好事,所以我正在寻求建议。
我需要输出一个总值,它是lQ.[QUANTITY]
的条件和。条件是如果oQ.[FORM_FACTOR_ID]
等于1,则该特定行的输出等于lQ.[QUANTITY]
的值。如果oQ.[FORM_FACTOR_ID]
等于2,那么如果oQ.[INDIVIDUAL_PACKAGING]
为真,则查询中该特定行的输出等于lQ.[QUANTITY]
。如果值为false,则查询中该特定行的输出除以2.最终输出必须是单个整数。
QUANTITY FORM_FACTOR_ID INDIVIDUAL_PACKAGING
4 2 1
5 1 1
我需要一个为上表输出值7的查询。
QUANTITY FORM_FACTOR_ID INDIVIDUAL_PACKAGING
4 2 0
5 2 0
同样的查询需要为上表输出5。
这样做最好的方法是什么?
答案 0 :(得分:3)
如果我正确理解了这个问题,你只需要条件聚合 - CASE
作为SUM()
的参数。
如果我遵循逻辑,它看起来像:
SELECT SUM(CASE WHEN oq.FORM_FACTOR_ID = 1 THEN lQ.QUANTITY
WHEN oQ.FORM_FACTOR_ID = 2 AND oQ.INDIVIDUAL_PACKAGING = 1 THEN lQ.QUANTITY
WHEN oQ.FORM_FACTOR_ID = 2 AND oQ.INDIVIDUAL_PACKAGING = 0 THEN lQ.QUANTITY / 2
END)
FROM [dbo].[AOF_ORDER_LINE_QUEUE] lQ LEFT JOIN
[dbo].[AOF_ORDER_QUEUE] oQ
ON lQ.[SALES_ORDER_NUMBER] = oQ.[SALES_ORDER_NUMBER];