3
votes

Si trois colonnes sur dix ne retournent pas null dans le serveur SQL, doivent renvoyer une valeur spécifique dans une autre colonne

J'ai 10 colonnes nommées de p1, p2, p3, ..., p10. Si deux colonnes ont une valeur plutôt que NULL, j'ai besoin d'une colonne nommée Fee qui devrait renvoyer 1200. Si trois colonnes et plus ont une valeur plutôt que NULL, j'ai besoin que la colonne nommée Fee renvoie 1800.

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

Devrait être comme ça ..

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


5 commentaires

Qu'est-ce que tu as essayé jusque-là? Je suggérerais une expression CASE et quelques ajouts.


comment dois-je prendre chaque nom de colonne en utilisant CASE ?


astuce: CASE WHEN p1 EST NULL ALORS 1 ELSE 0 END + ... :) Allez-y, et si vous échouez, veuillez poster votre (vos) tentative (s).


Le résultat attendu ne correspond pas à votre description de votre règle d'entreprise. Vous affichez toutes les lignes à 1200, sauf celle avec plus de 3 correspondances. Qui est correct?


J'ai demandé à renvoyer 1200 si 2 colonnes ou moins ne sont pas nulles et 1800 si 3 colonnes et plus.


3 Réponses :


0
votes
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 

0 commentaires

0
votes
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 commentaires

4
votes

XXX

Table de mise à jour

 entrez la description de l'image ici

MODIFIER - Si les valeurs comportent toujours 3 caractères

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 commentaires