【问题标题】:T-SQL Divide value across rowsT-SQL 跨行除值
【发布时间】:2012-10-28 18:02:40
【问题描述】:

我在表格中有以下列和数据:

PeriodID Days
1        NULL
2        NULL
3        NULL
4        NULL
5        NULL

然后我有几天应该按如下方式划分行:

  1. 如果天数

    PeriodID Days
    1        NULL
    2        NULL
    3        NULL
    4        1
    5        1
    
  2. 如果 days >= 5 并且 days%5=0(例如 5),我将拥有:

    PeriodID Days
    1        1    
    2        1    
    3        1    
    4        1    
    5        1
    
  3. 如果 days > 5 并且 days%5!=0(例如 12)我将拥有:

    PeriodID Days
    1        3    
    2        3    
    3        2    
    4        2    
    5        2
    

我可以通过循环来做到这一点,我希望使用一些智能技术或 T-SQL 函数获得更好的解决方案。提前致谢。

【问题讨论】:

  • 我有几天的最后一个例子。 12/5=2 和 12%2=2,所以每个时期有 2 天,其余 2 天从乞讨中填充(时期 1 有 3,时期 2 有 3)
  • 我不明白您正在使用的逻辑 - 为什么如果小于 5,它们首先分配给更大的时段(4 和 5),而如果大于 5,则分配给非 5 的倍数第一个到较小的时期(1 和 2)?
  • 好吧,因为我每次需要有 5 个周期,这是示例数据。在实际情况中,我在条形图中显示此信息,如果没有数据,则需要首先填充右侧条(较大的周期)。无论如何,这不是那么重要,我可以在渲染图表的代码中移动这个逻辑。不管怎样,你所说的关于逻辑的一切,你都理解正确。

标签: sql-server tsql default-value between divide


【解决方案1】:

这应该为你做:

DECLARE @numDays int
SET @numDays = 12

UPDATE someTable
SET Days = CASE WHEN @numDays < 5 
                  THEN CASE WHEN @numDays >= 6 - PeriodId THEN 1 ELSE NULL END
                ELSE FLOOR((@numDays + 5 - PeriodId) / 5)
           END

【讨论】:

  • 非常感谢,这对我的所有情况都有效。此外,您使用 FLOOR 函数解决问题的方式非常巧妙。
  • +1 非常聪明,虽然地板不是必需的,不是在 sql server 上
  • @t-clausen.dk 正确,没有必要,但意图更清楚:)
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2012-07-03
  • 2012-01-02
相关资源
最近更新 更多