当前位置: 首页 > 面试题库 >

SQL中的嵌套CASE

陆绍辉
2023-03-14
问题内容

表格1:

ARTIKEL      SUPPLIERID   SALE_SUM_PIECES   
TV            SONY            7

表2:

 ROW_ID     ARTIKEL      SUPPLIERID     PIECES    
    1           TV            SONY       6       
    2           TV            SONY       10      
    3           TV            SONY       6      
    4           TV            SONY       14       
    5           TV            SONY       18      
    6           TV            SONY       4

我只需要在值TABLE1。“ SALE_SUM_PIECES”小于TABLE2中“
PIECES”的总和时减去X=23onTABLE2."PIECES"的值。例如:的值TABLE1."SALE_SUM_PIECES"就是7。现在,我需要检查7 goes less thanSUM的值在哪一行TABLE2."PIECES"。在下面的示例中,TABLE2中的第一行无效,因为7大于6。但是TABLE2中的第二行是有效的,因为row1中“块”的总和并且TABLE2中的row2即6
+ 10 = 16大于7。因此,我需要X=23从第二行减去的后续行中的值TABLE2。我的查询如下:

SELECT "SUPPLIERID", "ARTIKEL",
    (case when ( cumulativesum - (select "SALE_SUM_PIECES" from  T1 where T1."SUPPLIERID"=T2."SUPPLIERID" and T1."ARTIKEL" = T2."ARTIKEL" )) <= 0
        then NULL
        when ( cumulativesum - (select "SALE_SUM_PIECES" from  TABLE1 T1 where T1."SUPPLIERID"=T2."SUPPLIERID" and T1."ARTIKEL" = T2."ARTIKEL" )) > 0 
        then
            (case when @x - cumulativesum <= 0 and @x - (cumulativesum -PIECES) > 0
                 then 0
                 when @x - "cumulativesum" <= 0
                 then NULL
                 else @x - "cumulativesum"
            end) as "VALUE_DRILL_DOWN"
    from (SELECT T1."ARTIKEL", T1."SUPPLIERID", T1.PIECES
             (select sum("PIECES")
              from EXAMPLE_TABLE T2
              where T2."ROW_ID" <= T1."ROW_ID" and T2."SUPPLIERID" = T1."SUPPLIERID" and T2."ARTIKEL"=T1."ARTIKEL"
             ) as "cumulativesum"
     from EXAMPLE_TABLE T1
     )

当我执行上面的查询时,我得到的结果如下:

 ROW_ID     ARTIKEL      SUPPLIERID    PIECES     VALUE_DRILL_DOWN
    1           TV            SONY      6            NULL
    2           TV            SONY      10           7
    3           TV            SONY      6            1
    4           TV            SONY      14           0
    5           TV            SONY      18           Null
    6           TV            SONY       4           Null

但我希望结果如下:

   ROW_ID       ARTIKEL      SUPPLIERID    PIECES    VALUE_DRILL_DOWN
    1           TV            SONY           6           NULL
    2           TV            SONY          10           13
    3           TV            SONY          6            7
    4           TV            SONY          14           0
    5           TV            SONY          18           Null
    6           TV            SONY          4            Null

我希望从表2中的行(条件TABLE1."SALE_SUM_PIECES" < TABLE2."PIECES"从行2)开始减去麓X = 2323
。有什么建议?

提前致谢。


问题答案:

以下解决方案可提供所需的结果。参见SqlFiddle

1   TV  SONY    922 6   110 2.50    NULL
2   TV  SONY    922 10  80  1.00    13
3   TV  SONY    922 6   65  1.50    7
4   TV  SONY    922 14  95  1.50    0
5   TV  SONY    922 18  95  1.50    NULL
6   TV  SONY    922 4   95  1.50    NULL



DECLARE @x INT = 23

; WITH cte AS
(
    SELECT t2.*, t1.SALE_SUM_PIECES,
            CASE 
                WHEN SUM(t2.PIECES) OVER (PARTITION BY t2.ARTIKEL, t2.SUPPLIERID ORDER BY ROW_ID) < t1.SALE_SUM_PIECES THEN 'None'
                ELSE t2.ARTIKEL + t2.SUPPLIERID
            END AS GroupId
    FROM @Table2 t2
    JOIN @Table1 t1 ON t2.ARTIKEL = t1.ARTIKEL AND t2.SUPPLIERID = t1.SUPPLIERID
),
cumulative AS
(
    SELECT *, SUM(PIECES) OVER (PARTITION BY GroupId ORDER BY ROW_ID) AS CumulativeSum
    FROM cte
)
SELECT ROW_ID, ARTIKEL, SUPPLIERID, ORGID, PIECES, COSTPRICE, DISCOUNT, 
        CASE
            WHEN CumulativeSum < SALE_SUM_PIECES THEN NULL
            WHEN @x - CumulativeSum <= 0 AND @x - (CumulativeSum - PIECES) > 0 THEN 0
            WHEN @x - CumulativeSum <= 0 THEN NULL
            ELSE @x - CumulativeSum
        END AS VALUE_DRILL_DOWN
FROM cumulative


 类似资料:
  • 问题内容: 我有一个数据库,并且使用查询来生成一个中间表,如下所示: 我想为a <avg(a)的用户计算b的标准偏差 我以这种方式计算avg(a),并且效果很好: 但是查询: 返回一个错误,更准确地说,我被告知无法识别avg中的“ a”(选择a from …)。这使我感到非常困惑,因为它可以在上一个查询中使用。 如果有人可以帮助我,我将不胜感激。 编辑: 我将查询结果存储到临时表中以生成中间表,但

  • 问题内容: 我敢肯定这已经被问过了,但是我不知道确切地称呼它是什么来找到答案。 我有一个类别和子类别的表格。他们每个人都有一个ID和一个父母ID。如果是顶级类别,则父ID为0。子类别的父ID设置为其父ID。 我正在尝试编写一个SQL查询,该查询将按此顺序提供所有类别: A,a1,a2,a3,B,b1,b2,b3 这在SQL中是可能的,还是我需要使用多个查询 谢谢布拉德 问题答案: 这样的事情可能会

  • 我有3个表作为学生数据,包括学生的数据,科目表的数据提供的所有科目和分数,学生获得的每一个科目的分数。通过StudentId标记到StudentData表的表映射,通过SubjectId标记到Subjects表的表映射 我想做的是选择每个科目的最高分数和学生的名字,如下所示 所以我写了一个甲骨文PL / SQL查询如下, 但它只给出了一个结果。请帮助我开发一个查询来获取我的预期结果集。

  • 问题内容: 我正在用SQL编写此查询: 首先,我将进行分组,但是接下来,会发生什么? 问题答案: 如果你有这样的事情 分组后 因此,下面的查询将返回45作为DepartmentId 3的“最高平均工资”

  • 如何聚合一个值在嵌套在Elasticsearch嵌套位置?我对一个嵌套对象没有问题,但在嵌套对象内的嵌套我感到困惑... 样本数据: 欲望结果: 在索引映射中,我将cat_a和条目字段的类型设置为嵌套,当我从工具字段查询聚合时,在cat_a的根(级别1)中没有问题,并且可以工作,但是在聚合中在rx_a(这是在第2级)我不能检索结果,它或空或显示错误,因为我的错误查询。 查询级别1 agg: 如何处

  • 我正在使用Cosmos DB,并有一个具有以下简化结构的文档: 我的问题是-我有一个这些文档的数组,需要搜索以查看它是否与我的搜索词匹配。例如,如果用户输入,我希望和都返回。 所以目前我将每个文档推送到一个数组中并执行以下操作: 每个文档的 、< code>id2和< code>id3。 使用cosmosDB,我使用SQL,代码如下: 这有效地将集合中的每个文档放入一个数组中,以手动执行上述搜索。