SQL-запрос для подсчета вхождений значения в одной строке - PullRequest
2 голосов
/ 13 января 2011

Пожалуйста, смотрите следующую таблицу примеров.Я хотел бы посчитать 1 в каждом ряду.Для первой строки N_1 должно быть 3, для второй 2, затем 1, затем 0. В конце я хотел бы включить это в хранимую процедуру с параметрами Table, Columns, Value.

CREATE TABLE Have 
( Col1 INT NOT NULL
, Col2 INT NOT NULL
, Col3 INT NOT NULL
, N_1 INT NULL 
)
INSERT Have (Col1, Col2, Col3)
    VALUES
     (1, 1, 1)
    ,(1, 1, 2)
    ,(1, 2, 2) 
    ,(2, 2, 2)

Ответы [ 3 ]

5 голосов
/ 13 января 2011

попробуйте

select Col1, Col2, Col3,
case when col1 = 1 then 1 else 0 end +
case when col2 = 1 then 1 else 0 end +
case when col3 = 1 then 1 else 0 end as N_1
 from Have

или если вам нужно обновить таблицу

 update Have set N_1 = case when col1 = 1 then 1 else 0 end +
case when col2 = 1 then 1 else 0 end +
case when col3 = 1 then 1 else 0 end

, тогда вы можете выполнить

select * from Have
1 голос
/ 13 января 2011

Является ли этот общий процесс тем, что вы ищете?

CREATE proc p_count
@table sysname, @columns nvarchar(max), @value nvarchar(max), @separator char(1) = ','
-- expected format of @columns is comma separated names
-- embedded commas supported by using a different @separator
as
declare @sql nvarchar(max)
set @sql = 
'select *,
case when ' + replace(@columns, @separator, '=' + QuoteName(@value,'''') +
' then 1 else 0 end + case when ') + '=' + QuoteName(@value,'''') + ' then 1 else 0 end
from ' + quotename(@table)
--print @sql
exec (@sql)
GO

Использование:

exec p_count 'have', 'col1|[col2]|col3', 1, '|'
exec p_count 'have', 'col1,col2,col3', 1

Эта альтернативная версия принимает необязательный параметр и обновляет столбец в той же таблице с помощью счетчика.

CREATE proc p_count
@table sysname, @columns nvarchar(max), @value nvarchar(max), @separator char(1) = ',', @updateto sysname = null
-- expected format of @columns is comma separated names
-- embedded commas supported by using a different @separator
as
declare @sql nvarchar(max)
set @sql = 
case when @updateto is null then 'select' else 'update x set ' + quotename(@updateto) + '=' end +
' case when ' + replace(@columns, @separator, '=' + QuoteName(@value,'''') +
' then 1 else 0 end + case when ') + '=' + QuoteName(@value,'''') + ' then 1 else 0 end
from ' + quotename(@table) + ' x'
print @sql
exec (@sql)
GO

Использование (обновление N_1):

exec p_count 'have', 'col1,col2,col3', 1, ',', 'N_1'
select * from have
0 голосов
/ 13 января 2011

По вашему запросу ошибка bilnil, должна быть

select *, 
( case Col1 when 1 then 1 else 0 end ) +
( case Col2 when 1 then 1 else 0 end ) +
( case Col3 when 1 then 1 else 0 end ) 
from have
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...