У меня есть таблица с данными, как показано ниже, и я хотел бы, чтобы значения 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
Кто-нибудь может мне помочь?
Какая версия SQL Server?
Здесь также могут быть полезны дополнительные примеры, так как здесь подойдет MAX
.
спасибо вам, ребята. Я отредактировал свой вопрос. МАКС здесь не работает. Я использую SQL-сервер 2020
SQL Server 2020 нет. Были релизы в 2019 и 2022 годах, но не в 2020.
Название столбца ID
подразумевает, что оно уникально. Используйте другое имя для неуникального столбца.
Эти данные и модель не являются реляционными. Почему в наборе результатов 4 строки, а не пять? Куда делся пятый?
куда пропал пятый ряд?
Я думаю, строку (1,'TX',Null,NUll,'EEE','1234')
следует исключить из вывода.
Да, этого можно добиться, используя функцию агрегирования 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 как ноль.
Я получаю следующие выходные данные: Состояние идентификатора 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
@VijayPanwar, вам следует использовать where ...
после агрегации max(...)over(...) (dbfiddle.uk/oBj7zdbZ)
Посмотрите ожидаемый результат: 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
большая часть решений работает, но я выбрал это. спасибо, ребята, еще раз
См. пример
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
Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, то есть логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;).