如果value = 0,则使用另一列的值

时间:2018-05-21 10:06:13

标签: sql-server sql-server-2008

我有两列包含值,列A和列B.列A从不具有0值,但是列B确实存在,但不是那么多。我宁愿使用B列中的值,因为它们更准确,但如果值为0,那么我想在同一行中使用该值,但是在A列中。我希望有一个额外的列称为C,它主要存储列B的值,但如果它在特定行中为0,则它​​将具有列A的值。在excel中这很容易,我只需:IF(B2 = 0,A2,B2) )。但我不确定如何在SQL中实现这一点。以下是我的代码:

select 
date,
shift,
location as loc
Sum(columnA) as A,
Sum(columnB) as B,
from data
where date = (select max(date) from data)  
and loc in ('locationA','LocationB')
group by date, shift, location, columnA, columnB
order by date, shift

以下是我想要实现的目标:

Date       Shift location   Value A     Value B     Value C
21-05-2018  Day  locationA  0.04122204  0.887057531 0.887057531
21-05-2019  Day  locationA  0.928499827 0.580402396 0.580402396
21-05-2020  Day  locationB  0.092689448 0           0.092689448
21-05-2021  Day  locationA  0.848076929 0.300175453 0.300175453
21-05-2022  Day  locationA  0.231515332 0           0.231515332
21-05-2023  Day  locationB  0.982522662 0.560335678 0.560335678
21-05-2024  Day  locationA  0.253062961 0.82718016  0.82718016
21-05-2025  Day  locationA  0.334965117 0           0.334965117
21-05-2026  Day  locationB  0.799616495 0.207699462 0.207699462
21-05-2027  Day  locationA  0.493148616 0.368975734 0.368975734
21-05-2028  Day  locationA  0.337537045 0.832800529 0.832800529
21-05-2029  Day  locationB  0.520104195 0.17532647  0.17532647
21-05-2030  Day  locationA  0.845699549 0           0.845699549
21-05-2031  Day  locationB  0.731698971 0.132675791 0.132675791

4 个答案:

答案 0 :(得分:1)

您可以使用ISNULLNULLIF来实现与以下相同的目标:

SELECT 
ISNULL(NULLIF(ValueB, 0), ValueA) AS ValueC
FROM tableData

如果经常需要,那么你可以在物理表本身中添加计算列,这比这更好。

OR

在向ValueB插入值时,您可以以相同的方式添加CASE,这是一次性任务,然后您可以直接选择ValueB,无任何条件。

答案 1 :(得分:0)

你总是可以使用像这样的案例陈述

case 
  when columnB=0
  then columnA
  else columnB
end as columnC

我不理解您的输出与您提供的查询的相关性,并且不会对其进行评论。

但请注意,您可以在SUM(case...)以外的分组功能中使用案例,例如case SUM(columnB)=0 then..

答案 2 :(得分:0)

试试这个答案

CASE
  WHEN ISNULL(columnB,0)=0
  THEN columnA
  ELSE columnB
END  AS  columnC

答案 3 :(得分:0)

创建PERSISTED列。以下是如何创建持久列。

CREATE TABLE [dbo].[Test](
    [Id] [int] NULL,
    [ColumnA] [int] NOT NULL,
    [ColumnB] [int] NOT NULL,
    [ColumnC]  AS (case when [ColumnB]=(0) then [ColumnA] else [ColumnB] end) PERSISTED NOT NULL
) ON [PRIMARY]

GO