【问题标题】:How can I selectively NULL out values from one column but not another?我怎样才能有选择地从一列而不是另一列中清空值?
【发布时间】:2017-11-20 11:40:54
【问题描述】:

如果我从我的 dbo.targetsvssales 表中选择所有,我会得到以下结果:

    Date   | Sales | Targets
_____________________________
2017-01-01     10      10
2017-02-01     19      20
2017-03-01     31      30
2017-04-01     38      40
2017-05-01     49      50
2017-06-01     62      60
2017-07-01     70      70
2017-08-01     75      80
2017-09-01     88      90
2017-10-01     101     100
2017-11-01     105     110
2017-12-01     105     120

我只想选择日期小于当前日期的销售数据,将未来日期的结果保留为空,但保持目标值不变。所以 select 语句的期望结果是:

    Date   | Sales | Targets
_____________________________
2017-01-01     10      10
2017-02-01     19      20
2017-03-01     31      30
2017-04-01     38      40
2017-05-01     49      50
2017-06-01     62      60
2017-07-01     70      70
2017-08-01     75      80
2017-09-01     88      90
2017-10-01     101     100
2017-11-01     105     110
2017-12-01     NULL    120

这需要能够全年工作,以及在具有每周和每日精度的表上作为日期列,所以使用

WHERE DATE > GETDATE()

或类似的东西是理想的。任何帮助或建议将不胜感激。

【问题讨论】:

  • case when date > getdate() then null else date end

标签: sql sql-server


【解决方案1】:

使用case 定义此列的结果:

CASE WHEN DATE <= GETDATE()
     THEN Sales
 END AS Sales

注意我已经颠倒了你的逻辑并跳过了else null,因为如果省略,这无论如何都是默认的。

更多案例:http://modern-sql.com/feature/case

【讨论】:

    【解决方案2】:

    案例可以解决这个问题。

    CASE WHEN DATE<=GETDATE() THEN Sales ELSE NULL END
    

    【讨论】:

      【解决方案3】:

      你可以使用 Cas When 语句

      select date,
       CASE 
        WHEN Date <= GETDATE()
        THEN Sales
        else NULL
       End as Sales,
       targets
      from dbo.targetsvssales
      

      【讨论】:

        【解决方案4】:
        DECLARE @targetsvssales AS TABLE ([Date] DATE,   Sales MONEY, Targets MONEY)
        INSERT INTO @targetsvssales VALUES
        ('2017-01-01',10,10),
        ('2017-02-01',19,20),
        ('2017-03-01',31,30),
        ('2017-04-01',38,40),
        ('2017-05-01',49,50),
        ('2017-06-01',62,60),
        ('2017-07-01',70,70),
        ('2017-08-01',75,80),
        ('2017-09-01',88,90),
        ('2017-10-01',101,100),
        ('2017-11-01',105,110),
        ('2017-12-01',105,120)
        
        SELECT
         [Date] 
        ,CASE WHEN [DATE] > GETDATE() THEN NULL ELSE Sales END AS Sales 
        ,Targets
        
        FROM @targetsvssales
        

        【讨论】:

          【解决方案5】:

          使用这个:

          select Date, case when Date > getdate() then NULL else Sales end as Sales, Targets 
          from dbo.targetsvssales
          

          SQL HERE

          【讨论】:

            【解决方案6】:

            使用ROW_NUMBERCASE

            CREATE TABLE T (
                MDate DATE,
                Sales INT,
                Targetes INT
                );
            
            INSERT INTO T VALUES
            ('2017-01-01',     10 ,     10),
            ('2017-02-01',     19 ,     20),
            ('2017-03-01',     31 ,     30),
            ('2017-04-01',     38 ,     40),
            ('2017-05-01',     49 ,     50),
            ('2017-06-01',     62 ,     60),
            ('2017-07-01',     70 ,     70),
            ('2017-08-01',     75 ,     80),
            ('2017-09-01',     88 ,     90),
            ('2017-10-01',     101,     100),
            ('2017-11-01',     105,     110),
            ('2017-12-01',     105,     120);
            
            WITH CTE AS (
            SELECT *, ROW_NUMBER () OVER (PARTITION BY Sales ORDER BY MDate) RN
            FROM T
                )
                SELECT MDate, CASE WHEN RN = 1 THEN Sales ELSE NULL END AS Sales, Targetes
                FROM CTE;
            

            如果你真的想和GETDATE()比较,那么我建议使用IIFCASE作为:

            SELECT MDate, IIF(IIF(MDate <= GetDate(), Sales, NULL) AS Sales, Targetes
            FROM T;
            

            Demo

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-02
              • 1970-01-01
              • 2016-05-06
              • 2016-04-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多