【问题标题】:create a calculated column base on two column in SQL基于 SQL 中的两列创建计算列
【发布时间】:2022-06-14 17:23:03
【问题描述】:

我有一个下表,我需要根据类别和月份列创建一个计算列 (RA)。

    Oa  Sa  Ai  month   MDY
    5   10  2   Jan     J302022
    16  32  38  Jan     J302022
    15  14  4   Feb     J302022
    46  32  81  Jan     J302022
    3   90  0   Mar     J302022
    51  10  21  Jan     J302021
    19  32  3   Jan     J302021
    45  16  41  Feb     J302021
    46  7   81  Jan     J302022
    30  67  14  Mar     J302021
    45  16  41  Apr     J302021
    46  7   81  Apr     J302021
    30  67  0   Jan     J302021
    56  17  0   Mar     J302022

首先,它需要考虑一个类别,例如,J302022,然后它需要根据该类别的月份计算“RA”列。例如,J302022, Jan, ((5+16+46+46)+(10+32+32+7)) / (2+38+81+81) = 0.96。 所以下面是预期的输出。

    Oa  Sa  Ai  month   category    RA
    5   10  2   Jan     J302022     0.96
    16  32  38  Jan     J302022     0.96
    15  14  4   Feb     J302022     7.25
    46  32  81  Jan     J302022     0.96
    3   90  0   Mar     J302022     0
    51  10  21  Jan     J302021     8.70
    19  32  3   Jan     J302021     8.70
    45  16  41  Feb     J302021     1.48    
    46  7   81  Jan     J302022     0.96
    30  67  14  Mar     J302021     6.92
    45  16  41  Apr     J302021     1.48
    46  7   81  Apr     J302022     0.65    
    30  67  0   Jan     J302021     8.70
    56  17  0   Mar     J302022     0

是否可以在 SQL 中做到这一点?

提前致谢!

【问题讨论】:

  • 顺便说一下,你展示的两个数据样本不一样。 MDY 更改为 category,并且您的 Jan J302022 行实际上是第一个示例中的 Jan J302021。这使得测试变得有点困难,因为我必须对此进行纠正(但我没有否决你的问题)。
  • 这行46 7 81 Jan J302022怎么输入输出不一样?在输入中其46 7 81 Jan J302021 与输出中的46 7 81 Apr J302022 0.65 相同
  • 您使用的是哪个 dbms?

标签: sql


【解决方案1】:
select Oa, Sa, Ai, month, category, 
  coalesce((ra1+ra2)/ra3, 0) as RA 
from (
  select Oa, Sa, Ai, month, mdy as category, 
    sum(oa) over (partition by month, mdy) as ra1, 
    sum(sa) over (partition by month, mdy) as ra2, 
    sum(ai) over (partition by month, mdy) as ra3 
  from WhateverYourTableNameIs
) as t;

MySQL 8.0.29 上的输出:

+------+------+------+-------+----------+--------+
| Oa   | Sa   | Ai   | month | category | RA     |
+------+------+------+-------+----------+--------+
|   45 |   16 |   41 | Apr   | J302021  | 0.9344 |
|   46 |    7 |   81 | Apr   | J302021  | 0.9344 |
|   45 |   16 |   41 | Feb   | J302021  | 1.4878 |
|   15 |   14 |    4 | Feb   | J302022  | 7.2500 |
|   51 |   10 |   21 | Jan   | J302021  | 8.7083 |
|   19 |   32 |    3 | Jan   | J302021  | 8.7083 |
|   30 |   67 |    0 | Jan   | J302021  | 8.7083 |
|    5 |   10 |    2 | Jan   | J302022  | 0.9604 |
|   16 |   32 |   38 | Jan   | J302022  | 0.9604 |
|   46 |   32 |   81 | Jan   | J302022  | 0.9604 |
|   46 |    7 |   81 | Jan   | J302022  | 0.9604 |
|   30 |   67 |   14 | Mar   | J302021  | 6.9286 |
|    3 |   90 |    0 | Mar   | J302022  | 0.0000 |
|   56 |   17 |    0 | Mar   | J302022  | 0.0000 |
+------+------+------+-------+----------+--------+

【讨论】:

    【解决方案2】:

    对于 SQL Server

    select Oa, Sa, Ai, [Month],Category,
    case when (sum(Ai) over(partition by [Month], Category) *1.0) = 0 then 0 else 
    (sum(Oa) over(partition by [Month], Category) +
    sum(Sa) over(partition by [Month], Category))/
    (sum(Ai) over(partition by [Month], Category) *1.0) end Ra
    from #temp
    order by Category desc
    

    1.0乘以分母将输出转换为浮点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2021-12-08
      • 2014-10-18
      • 2020-08-31
      • 2017-06-15
      相关资源
      最近更新 更多