Если три из десяти столбцов не возвращают NULL на сервере SQL, следует вернуть конкретное значение в другом столбце - PullRequest
3 голосов
/ 26 марта 2019

У меня есть 10 столбцов с именами из p1, p2, p3, ..., p10. Если любые два столбца имеют значение, а не NULL, мне нужен столбец с именем Fee, который должен возвращать 1200. Если три и более столбца имеют значение, а не NULL, мне нужно, чтобы столбец с именем Fee возвращал 1800.

p1      p2      p3      p4      p5      p6      p7      p8      p9      p10      Fee
NULL    ENG     NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    POL     NULL    NULL    NULL    NULL    NULL    NULL
NULL    ENG     NULL    ECO     NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    ENG     TEL     ECO     HIS     POL     NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    ECO     NULL    NULL    NULL    NULL    NULL    NULL    NULL

Должно быть так ..

p1      p2      p3      p4      p5      p6      p7      p8      p9      p10      Fee
NULL    ENG     NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    1200
NULL    NULL    NULL    NULL    POL     NULL    NULL    NULL    NULL    NULL    1200
NULL    ENG     NULL    ECO     NULL    NULL    NULL    NULL    NULL    NULL    1200
NULL    ENG     TEL     ECO     HIS     POL     NULL    NULL    NULL    NULL    1800
NULL    NULL    NULL    ECO     NULL    NULL    NULL    NULL    NULL    NULL    1200

Ответы [ 3 ]

4 голосов
/ 26 марта 2019

Пример

Update YourTable 
   set Fee = case when len(concat(left(p1,1),left(p2,1),left(p3,1),left(p4,1),left(p5,1),left(p6,1),left(p7,1),left(p8,1),left(p9,1),left(p10,1))) <=3 then 1200 else 1800 end

Таблица обновлений

enter image description here

РЕДАКТИРОВАТЬ - Если значения всегда 3 символа

Update YourTable 
   set Fee = case when len(concat(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10))/3 <=3 then 1200 else 1800 end
0 голосов
/ 26 марта 2019
declare @t table (p1 char(3),p2 char(3),p3 char(3),p4 char(3),p5 char(3),p6 char(3)
,Fee AS CASE WHEN CASE WHEN p1 IS NULL THEN 0 ELSE 1 END
                 +CASE WHEN p2 IS NULL THEN 0 ELSE 1 END
                 +CASE WHEN p3 IS NULL THEN 0 ELSE 1 END
                 +CASE WHEN p4 IS NULL THEN 0 ELSE 1 END
                 +CASE WHEN p5 IS NULL THEN 0 ELSE 1 END
                 +CASE WHEN p6 IS NULL THEN 0 ELSE 1 END > 3 THEN 1800 ELSE 1200 END
)
insert into @t values (NULL,'ENG',NULL,NULL,NULL,NULL)
insert into @t values (NULL,NULL,NULL,NULL,'POL',NULL)
insert into @t values (NULL,'ENG',NULL,'ECO',NULL,NULL)
insert into @t values (NULL,'ENG','TEL','ECO','HIS','POL')
insert into @t values (NULL,NULL,NULL,'ECO',NULL,NULL)

select * from @t
0 голосов
/ 26 марта 2019
DECLARE @tbl TABLE
(
    Id INT IDENTITY(1,1),
    p1 VARCHAR(10) NULL,
    p2 VARCHAR(10) NULL,
    p3 VARCHAR(10) NULL,
    p4 VARCHAR(10) NULL,
    p5 VARCHAR(10) NULL,
    p6 VARCHAR(10) NULL,
    p7 VARCHAR(10) NULL,
    p8 VARCHAR(10) NULL,
    p9 VARCHAR(10) NULL,
    p10 VARCHAR(10) NULL,
    Fee VARCHAR(10)
)
INSERT INTO @tbl(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, Fee) VALUES( NULL,    'ENG',     NULL,    NULL,    NULL ,   NULL,    NULL ,   NULL,    NULL,    NULL,    NULL)
INSERT INTO @tbl(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, Fee) VALUES( NULL,    NULL,    NULL,    NULL,    'POL',     NULL,    NULL,    NULL,    NULL,    NULL,    NULL)
INSERT INTO @tbl(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, Fee) VALUES( NULL,    'ENG',     NULL,    'ECO',     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL)
INSERT INTO @tbl(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, Fee) VALUES( NULL,    'ENG',     'TEL',    'ECO',     'HIS',     'POL',     NULL,    NULL,    NULL,    NULL,    NULL)
INSERT INTO @tbl(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, Fee) VALUES( NULL,    NULL,    NULL,    'ECO',     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL)

SELECT p1, p2,p3,p4,p5,p6,p7,p8,p9,p10, a.NoOfColumnWithoutNull,
Fee = CASE WHEN a.NoOfColumnWithoutNull = 2 THEN 1200
      WHEN a.NoOfColumnWithoutNull = 3 THEN 1800
      ELSE 0 END
  FROM (
SELECT p1, p2,p3,p4,p5,p6,p7,p8,p9,p10, 
NoOfColumnWithoutNull = 
IIF(LEN(p1) > 0,1,0) + IIF(LEN(p2) > 0,1,0) + IIF(LEN(p3) > 0,1,0) + IIF(LEN(p4) > 0,1,0) + IIF(LEN(p5) > 0,1,0) + IIF(LEN(p6) > 0,1,0) 
+ IIF(LEN(p7) > 0,1,0) + IIF(LEN(p8) > 0,1,0) + IIF(LEN(p9) > 0,1,0) + IIF(LEN(p10) > 0,1,0) 
FROM @tbl ) AS a 
...