Как добавить одно и то же значение во все строки, если значение столбца равно NULL

У меня есть таблица с данными, как показано ниже, и я хотел бы, чтобы значения col4 и col5 повторялись для всех строк, и мне не нужны значения col2 и col3 с нулевым значением.

create table #table1(
ID int,
State varchar(50),
Col2 varchar(10),
Col3 varchar(10),
Col4 varchar(10),
Col5 varchar(10)
)


insert into #table1 
select 1,'TX',Null,NUll,'EEE','1234'
UNION ALL
select 1,'TX','AAA' ,'3456',NULL,NULL            
UNION ALL
select 1,'TX','BNH' ,'3467',NULL,NULL  
UNION ALL
select 1,'TX','GFR' ,'1356',NULL,NULL  
UNION ALL
select 1,'TX','UPY' ,'2345',NULL,NULL 

Если я сделаю Max для столбцов, в результате я получу только одну строку

select ID,State,
MAX(Col2) as Col2,
MAX(Col3) as Col3,
MAX(Col4) as Col4,
MAX(Col5) as Col5
from #table1
group by ID,State

Result:
ID  State   Col2    Col3    Col4    Col5
1   TX      UPY     3467    EEE     1234

Ожидаемый окончательный результат:

ID  State  col2  col3   Col4   Col5
1   TX     AAA   3456   EEE   1234
1   TX     BNH   3467   EEE   1234
1   TX     GFR   1356   EEE   1234
1   TX     UPY   2345   EEE   1234

Кто-нибудь может мне помочь?

Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, то есть логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;).

Yitzhak Khabinsky 28.08.2024 18:04

Какая версия SQL Server?

Thom A 28.08.2024 18:04

Здесь также могут быть полезны дополнительные примеры, так как здесь подойдет MAX.

Thom A 28.08.2024 18:13

спасибо вам, ребята. Я отредактировал свой вопрос. МАКС здесь не работает. Я использую SQL-сервер 2020

unicorn 28.08.2024 18:17

SQL Server 2020 нет. Были релизы в 2019 и 2022 годах, но не в 2020.

Thom A 28.08.2024 19:00

Название столбца ID подразумевает, что оно уникально. Используйте другое имя для неуникального столбца.

The Impaler 28.08.2024 19:53

Эти данные и модель не являются реляционными. Почему в наборе результатов 4 строки, а не пять? Куда делся пятый?

The Impaler 28.08.2024 19:55

куда пропал пятый ряд?

Salman Arshad 29.08.2024 10:43

Я думаю, строку (1,'TX',Null,NUll,'EEE','1234') следует исключить из вывода.

ValNik 29.08.2024 10:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
116
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Да, этого можно добиться, используя функцию агрегирования MAX с оператором CASE для выбора ненулевых значений из col4 и col5. Оператор CASE проверяет, не является ли значение нулевым, и, если да, возвращает значение.

Вот пример:

SELECT 
  ID,
  State,
  col2,
  col3,
  MAX(CASE WHEN Col4 IS NOT NULL THEN Col4 END) OVER (PARTITION BY ID) AS Col4,
  MAX(CASE WHEN Col5 IS NOT NULL THEN Col5 END) OVER (PARTITION BY ID) AS Col5
FROM 
  YourTable
WHERE 
  col2 IS NOT NULL AND col3 IS NOT NULL

Я использую столбцы ID, State, col2 и col3, а также вычисляемые столбцы col4 и col5.

Это агрегирование данных и исключение нуля.

это даст мне значение Col4 и col5 как ноль.

unicorn 28.08.2024 18:18

Я получаю следующие выходные данные: Состояние идентификатора col2 col3 Col4 Col5 1 TX AAA 3456 EEE 1234 1 TX BNH 3467 EEE 1234 1 TX GFR 1356 EEE 1234 1 TX UPY 2345 EEE 1234

Vijay Panwar 28.08.2024 19:03

@VijayPanwar, вам следует использовать where ... после агрегации max(...)over(...) (dbfiddle.uk/oBj7zdbZ)

ValNik 28.08.2024 21:47

Посмотрите ожидаемый результат: col2 и col3 возвращают свое собственное значение вместо максимального значения столбца, поэтому сгруппируйте их по предложению.

select
  ID,
  State,
  Col2,
  Col3,
  MAX(Col4) as Col4, 
  MAX(Col5) as Col5
from #table1
group by ID,State
where col2 is not null and col3 is not null
Ответ принят как подходящий

Функция IsNull удовлетворит ваши требования.

select id, state,col2,col3
  ,isnull(col4, (select max(col4) from #table1)) col4
  ,isnull(col5, (select max(col5) from #table1)) col5
from #table1
where col2 is not null and col3 is not null

большая часть решений работает, но я выбрал это. спасибо, ребята, еще раз

unicorn 30.08.2024 16:56

См. пример

select *
from(
  SELECT ID, State,
    col2, col3,
    MAX(Col4) OVER (PARTITION BY ID) AS Col4,
    MAX(Col5) OVER (PARTITION BY ID) AS Col5
  FROM #Table1
)t
WHERE col2 IS NOT NULL AND col3 IS NOT NULL

Другие вопросы по теме