Используйте значение из другого столбца, если значение = 0 - PullRequest
0 голосов
/ 21 мая 2018

У меня есть 2 столбца со значениями, столбец 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 голосов
/ 21 мая 2018

Вы можете использовать ISNULL и NULLIF для достижения того же, что и ниже:

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

Если это часто требуется, вы можете добавить вычисляемый столбец в самой физической таблице, что является более подходящим подходом.чем это.

ИЛИ

при вставке значения в ValueB вы можете добавить CASE таким же образом, что является единовременной задачей, затем вы можете выбрать ValueB напрямую без каких-либо условий.

0 голосов
/ 21 мая 2018

Попробуйте этот ответ

CASE
  WHEN ISNULL(columnB,0)=0
  THEN columnA
  ELSE columnB
END  AS  columnC
0 голосов
/ 21 мая 2018

Создать столбец 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
0 голосов
/ 21 мая 2018

Вы всегда можете использовать оператор case, подобный этому

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

Я не понимаю взаимосвязи вашего вывода с предоставленным вами запросом и воздержусь комментировать его.

Однако обратите вниманиечто вы можете использовать регистр внутри группирующих функций, таких как SUM(case...), а также вне его, таких как case SUM(columnB)=0 then..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...