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
3 Réponses :
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
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
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.