Maison > Questions et réponses > le corps du texte
J'essaie de définir une plage saisonnière pour une date spécifique à partir de la table DTBL_SCHOOL_DATES. Vous trouverez ci-dessous ma logique qui définit les saisons dans une plage donnée en fonction de l'année et de sa région.
CASE WHEN RTRIM(dtbl_school_dates.local_school_year) = '2021-2022' THEN CASE WHEN RTRIM(dtbl_schools_ext.region) = 'Bay Area' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '08/07/2021' and '09/08/2021' THEN 'FALL' WHEN RTRIM(dtbl_schools_ext.region) = 'Bay Area' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '11/27/2021' and '12/15/2021' THEN 'WINTER' WHEN RTRIM(dtbl_schools_ext.region) = 'Bay Area' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '03/04/2022' and '03/22/2022' THEN 'SPRING' WHEN RTRIM(dtbl_schools_ext.region) = 'Central Valley' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '07/31/2021' and '09/01/2021' THEN 'FALL' WHEN RTRIM(dtbl_schools_ext.region) = 'Central Valley' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '11/27/2021' and '12/15/2021' THEN 'WINTER' WHEN RTRIM(dtbl_schools_ext.region) = 'Central Valley' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '02/19/2022' and '03/08/2022' THEN 'SPRING' WHEN RTRIM(dtbl_schools_ext.region) = 'Los Angeles' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '08/14/2021' and '09/15/2021' THEN 'FALL' WHEN RTRIM(dtbl_schools_ext.region) = 'Los Angeles' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '11/27/2021' and '12/15/2021' THEN 'WINTER' WHEN RTRIM(dtbl_schools_ext.region) = 'Los Angeles' AND CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '03/04/2022' and '03/22/2022' THEN 'SPRING' ELSE 'NOT IN RANGE' END ELSE FTBL_TEST_SCORES.test_admin_period END AS "C4630"
Mais chaque fois que les dates ne se situent pas dans la plage spécifiée dans la logique, je souhaite qu'elles soient ignorées. Les valeurs AKA « hors plage » doivent être exclues. J'ai essayé d'utiliser FTBL_TEST_SCORES.test_admin_period non nul et comme aucune valeur dans la base de données n'est nulle, ils ne fonctionneront pas.
Les valeurs qui ne sont pas dans la plage doivent être exclues du résultat, comment puis-je y parvenir dans la clause Where
J'ai essayé de limiter l'utilisation d'Alias mais cela n'a pas fonctionné. Je ne sais pas s'il est possible d'attribuer une valeur à un champ spécifique dans une instruction case, comme Case when 'a' then field ='B' end
Les valeurs qui ne sont pas dans la plage doivent être exclues du résultat, comment puis-je y parvenir dans la clause Where
P粉0837850142023-09-12 16:42:13
Sans pouvoir voir la requête complète, il est impossible de trouver la meilleuresolution. La solution la plus simple est d'ajouter le critère sous forme de clause HAVING
:
HAVING `C4630` <> 'NOT IN RANGE'
Je ne comprends pas votre format de date. S'il s'agit de requêtes MySQL, elles doivent être au format aaaa-mm-jj. On peut soutenir qu'ils devraient être dans ce format même sur SQL Server qui prend en charge des formats de date natifs ambigus.
Pourquoi sont-ils tousRTRIM
和CAST
? Les données doivent être stockées dans le format correct et nettoyées lors de la saisie. Si cela n'est pas possible, nettoyez les données régulièrement plutôt qu'à chaque requête.
Il est sage de déplacer votre 季节
移动到它们自己的表中,而不是在查询时定义它们。然后它是一个简单的连接到seasons
. J'utilise une sous-requête ici, mais j'espère que vous voyez l'idée :
SELECT /* other columns */ COALESCE(seasons.season, FTBL_TEST_SCORES.test_admin_period) AS `C4630` FROM all_the_other_tables LEFT JOIN ( SELECT 'Bay Area' AS region, 'FALL' AS season, '2021-08-07' AS start, '2021-09-08' AS end UNION ALL SELECT 'Bay Area' , 'WINTER' , '2021-11-27' , '2021-12-15' UNION ALL SELECT 'Bay Area' , 'SPRING' , '2022-03-04' , '2022-03-22' UNION ALL SELECT 'Central Valley' , 'FALL' , '2021-07-31' , '2021-09-01' UNION ALL SELECT 'Central Valley' , 'WINTER' , '2021-11-27' , '2021-12-15' UNION ALL SELECT 'Central Valley' , 'SPRING' , '2022-02-19' , '2022-03-08' UNION ALL SELECT 'Los Angeles' , 'FALL' , '2021-08-14' , '2021-09-15' UNION ALL SELECT 'Los Angeles' , 'WINTER' , '2021-11-27' , '2021-12-15' UNION ALL SELECT 'Los Angeles' , 'SPRING' , '2022-03-04' , '2022-03-22' ) AS seasons ON dtbl_school_dates.local_school_year = '2021-2022' AND dtbl_schools_ext.region = seasons.region AND dtbl_school_dates.date_value BETWEEN seasons.start AND seasons.end WHERE ( (dtbl_school_dates.local_school_year = '2021-2022' AND seasons.season IS NOT NULL) OR dtbl_school_dates.local_school_year <> '2021-2022' );
P粉7181655402023-09-12 13:39:57
Vous pouvez répéter l'intégralité de l'instruction CASE dans la clause WHERE comme ceci :
select case when x then y when a then b when c then d else 'NOT IN RANGE' end as foo from table t where case when x then y when a then b when c then d else 'NOT IN RANGE' end <> 'NOT IN RANGE'
Ou vous pouvez utiliser une sous-requête (ou CTE) comme celle-ci :
select * from ( select case when x then y when a then b when c then d else 'NOT IN RANGE' end as foo from table t ) where foo <> 'NOT IN RANGE'