【问题标题】:oracle sql count value for weeks until a specific column changesoracle sql 数周的计数值,直到特定列更改
【发布时间】:2017-07-01 19:53:30
【问题描述】:

我尝试计算特定任务的值,即使它们没有被更改。 我需要每周计算状态,直到状态发生变化(然后必须计算新状态)。 我得到下表作为基本值的结果。

SRQNR 千瓦状态 TB-17-0002 1 状态 05 TB-17-0002 1 状态 20 TB-17-0002 1 状态 25 TB-17-0002 1 状态 30 TB-17-0002 8 状态 40 TB-17-0002 8 状态 44 TB-17-0002 8 状态 45 TB-17-0004 1 状态 05 TB-17-0004 1 状态 20 TB-17-0004 2 状态 25 TB-17-0004 2 状态 30 TB-17-0004 2 状态 40 TB-17-0004 2 状态 44 TB-17-0004 4 状态 70 TB-17-0004 4 状态 85 TB-17-0004 4 状态 90 TB-17-0005 1 状态 05 TB-17-0005 1 状态 20 TB-17-0005 1 状态 25 TB-17-0005 1 状态 30 TB-17-0005 2 状态 40 TB-17-0005 2 状态 44 TB-17-0005 6 状态 45 TB-17-0006 1 状态 05 TB-17-0006 1 状态 20 TB-17-0006 1 状态 25 TB-17-0006 1 状态 30 TB-17-0006 1 状态 40 TB-17-0006 11 状态 44 TB-17-0006 11 状态 45 TB-17-0007 1 状态 05 TB-17-0007 1 状态 20 TB-17-0007 1 状态 25 TB-17-0007 1 状态 30 TB-17-0007 2 状态 40 TB-17-0007 2 状态 44 TB-17-0007 2 状态 45 TB-17-0008 1 状态 05 TB-17-0008 1 状态 20 TB-17-0008 2 状态 25 TB-17-0008 2 状态 30 TB-17-0008 2 状态 40 TB-17-0008 2 状态 44 TB-17-0008 2 状态 45 TB-17-0009 1 状态 05 TB-17-0009 1 状态 20 TB-17-0009 1 状态 25 TB-17-0009 1 状态 30 TB-17-0009 1 状态 40 TB-17-0009 15 状态 44 TB-17-0009 15 状态 45 TB-17-0010 1 状态 05 TB-17-0010 1 状态 20 TB-17-0010 1 状态 25 TB-17-0010 1 状态 30 TB-17-0010 1 状态 40 TB-17-0010 1 状态 44 TB-17-0010 5 状态 45 TB-17-0011 1 状态 05 TB-17-0011 1 状态 20 TB-17-0011 1 状态 25 TB-17-0011 11 状态 30 TB-17-0011 11 状态 40 TB-17-0011 11 状态 44 TB-17-0011 11 状态 70 TB-17-0011 11 状态 85 TB-17-0011 20 状态 90

例如,srqnr TB-17-0002 在 KW 1 中获得状态 30,在 KW8 中更改为状态 40。 现在我的愿望是 KW 2,3,4,5,6,7 将计入状态 30。

因为 SRQNS 在状态 30 中仍处于 KW 3 或 4 中,这也应该在解释中。

感谢您的解决方案。

【问题讨论】:

  • KW的数量是多少,从哪里来的?
  • 你能用值填写你想要的输出吗?我希望您不希望全为零,但不确定您期望什么值。
  • 我看不到这个问题的标题和请求的结果集格式之间的联系。
  • 我认为我对您帖子内容的问题是您没有明确定义您的条款。我唯一的线索是您帖子末尾的表格,这似乎暗示您的第一语言是德语,而 KW 是您在开头段落中提到的星期。我建议您在描述问题时不要混合使用语言。换句话说,KW 是基于德语的术语,而 week 是基于英语的术语。

标签: sql oracle count distinct-values


【解决方案1】:

将一组派生的范围作为行,将 KW 作为一组列,这似乎需要按这些范围分组,然后按 KW 值进行旋转。根据给出的样本数据产生了这个结果:

+----------+------+------+------+------+------+------+------+------+------+------+----+------+------+------+------+------+------+------+------+------+
|  RANGES  |  1   |  2   |  3   |  4   |  5   |  6   |  7   |  8   |  9   |  10  | 11 |  12  |  13  |  14  |  15  |  16  |  17  |  18  |  19  |  20  |
+----------+------+------+------+------+------+------+------+------+------+------+----+------+------+------+------+------+------+------+------+------+
| <=29     | 31   | 4    | null | null | null | null | null | null | null | null |  1 | null | null | null | null | null | null | null | null | null |
| 30 to 69 | 4    | 10   | null | null | 1    | 1    | null | 3    | null | null |  4 | null | null | null | 2    | null | null | null | null | null |
| 70 to 84 | null | null | null | 1    | null | null | null | null | null | null |  1 | null | null | null | null | null | null | null | null | null |
| 85 to 90 | null | null | null | 2    | null | null | null | null | null | null |  1 | null | null | null | null | null | null | null | null | 1    |
+----------+------+------+------+------+------+------+------+------+------+------+----+------+------+------+------+------+------+------+------+------+

使用这个查询:

SELECT 
   * 
FROM (
        select
           case when substr(status,-2,2) < '30' then '<=29'
                when substr(status,-2,2) between '30' and '69' then '30 to 69'
                when substr(status,-2,2) between '70' and '84' then '70 to 84'
                when substr(status,-2,2) between '85' and '90' then '85 to 90'
                else '???'
                end as ranges
         , KW
         , count(*) as counter
        from mytable t
        group by
           case when substr(status,-2,2) <= '30' then '<=29'
                when substr(status,-2,2) between '30' and '69' then '30 to 69'
                when substr(status,-2,2) between '70' and '84' then '70 to 84'
                when substr(status,-2,2) between '85' and '90' then '85 to 90'
                else '???'
                end
         , KW
        )
PIVOT (
   SUM(counter) 
   FOR 
      (KW) 
   IN 
      (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
    )
;

注意我没有尝试小心处理从状态到范围的子字符串。您可能更喜欢使用 IN(...),具体取决于该列中的实际数据。

dbfiddle here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多