SQL条件查询的解决方案

时间:2017-09-20 16:00:22

标签: sql sql-server sql-server-2008

我的任务是为今天早上发现的问题提出解决方案。我有一个查询,我需要做一些数学计算。我有三个相关的专栏。

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。

这样做最好的方法是什么?

1 个答案:

答案 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];