我有两列包含值,列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
答案 0 :(得分:1)
您可以使用ISNULL
和NULLIF
来实现与以下相同的目标:
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