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?
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
Vous devez vous connecter pour publier un commentaire.
Pas sûr de ce que vous voulez faire ici - vous pouvez assigner des variables en dehors de cas énoncé dans la clause select. Comme
Remarque que @var valeur à la valeur évaluée au cours de la dernière rangée. Comme dit plus tôt, je ne suis pas sûr de savoir comment vous comptez l'utiliser vous @quartersize variable. Si la valeur est nécessaire sur chaque ligne puis u ne devrait pas être à l'aide de la variable à tous.
OriginalL'auteur VinayC
Il ne peut pas être la solution la plus élégante, mais voici ce que j'ai.
J'ai joint une copie du script de détails à un groupés par version de la même chose.
Ce n'est pas une grosse affaire parce que la table n'a que 12 lignes pour chaque année, dans ce cas seulement 132 total de lignes.
Qui produit chaque exercice avec le nombre total de périodes au cours de chaque Exercice et s'il peut être divisible par 4 et 2. Il utilise ensuite la "Quarterific" valeur afin de déterminer s'ils doivent le faire dans l'instruction de mise à jour et je peux wtihout à l'aide de variables.
Il peut ne pas être la meilleure, mais elle fonctionne et est performante compte tenu de la petite série de données.
OriginalL'auteur DavidStein