En essayant de définir une variable dans une instruction case.

Je suis en train de mettre à jour une table de dimension date de la comptabilisation des années de table de notre Système ERP. Si j'exécute la Requête suivante:

SELECT fcname FYName
      ,min(fdstart) YearStart
      ,max(fdend) YearEnd
      ,max(fnnumber) PeriodCount
FROM M2MData01.dbo.glrule GLR
GROUP BY fcname

- Je obtenir les données suivantes:

FYName            YearStart                   YearEnd                 PeriodCount
FY 2000                 1/1/2000 12:00:00 AM    12/31/2000 12:00:00 AM  12
FY 2001                 1/1/2001 12:00:00 AM    12/31/2001 12:00:00 AM  12
FY 2002                 1/1/2002 12:00:00 AM    12/31/2002 12:00:00 AM  12
FY 2003                 1/1/2003 12:00:00 AM    12/31/2003 12:00:00 AM  12
FY 2004                 1/1/2004 12:00:00 AM    12/31/2004 12:00:00 AM  12
FY 2005                 1/1/2005 12:00:00 AM    12/31/2005 12:00:00 AM  12
FY 2006                 1/1/2006 12:00:00 AM    12/31/2006 12:00:00 AM  12
FY 2007                 1/1/2007 12:00:00 AM    12/31/2007 12:00:00 AM  12
FY 2008                 1/1/2008 12:00:00 AM    12/31/2008 12:00:00 AM  12
FY 2009                 1/1/2009 12:00:00 AM    12/31/2009 12:00:00 AM  12
FY 2010                 1/1/2010 12:00:00 AM    12/31/2010 12:00:00 AM  12

Dans mon cas, mon entreprise a 12 périodes par année, qui correspondent à peu près mois. En gros, je suis en train de créer une instruction de mise à jour pour régler les Trimestres d'Exercice qui va suivre cette logique:

1. Si PeriodCount est divisible par 4, alors le nombre de périodes au cours d'un trimestre PeriodCount/4.

2. Si PeriodNumber est dans le premier trimestre (dans ce cas, les périodes de 1 à 3) puis FiscalQuarter =1 et ainsi de suite pour les quarts de 2 à 4.

Le problème est que je ne peut pas être garanti que tout le monde utilise 12 périodes, certaines entreprises, je soutiens utiliser un autre numéro, par exemple 10.

J'ai commencé à créer l'instruction select suivante:

    DECLARE @QuarterSize   INT
DECLARE @SemesterSize   INT
SELECT TST.Date, 
CASE WHEN glr.PeriodCount % 4 = 0 THEN    
-- Can Be divided into quarters. Quarter size is PeriodCount/4
set  @quartersize = (GLR.PeriodCount/4)
CASE     
END
ELSE 0
End
FROM    m2mdata01.dbo.AllDates TST
INNER JOIN (
SELECT fcname FYName
,min(fdstart) YearStart
,MAX(fdend) YearEnd
,MAX(fnnumber) PeriodCount
FROM M2MData01.dbo.glrule GLR
GROUP BY fcname ) GLR
ON TST.DATE >= GLR.YearStart AND TST.DATE <= GLR.YearEnd

Puis-je définir la valeur d'une variable à l'intérieur d'une instruction de cas de ce genre? Quelle est la meilleure façon d'accomplir cette? Suis-je obligé d'utiliser un curseur de déclaration et de vérifier chaque jour dans ma dimension à l'encontre de la plage dans le tableau ci-dessus?

Je serais prudent avec la double utilisation de GLR dans votre exemple. Toujours en pensant à votre question en général.
Vous avez une variable (@QuarterSize) et plusieurs lignes (même si PeriodCount est la même dans chacun). Où avez-vous l'intention d'utiliser @QuarterSize et la ligne qui voulez-vous utiliser pour le calculer?

OriginalL'auteur DavidStein | 2010-08-12