Je me demande si quelqu'un pourrait être en mesure de résoudre ma requête. J'ai une table simple qui a des économies de projet par mois. Il y a toujours des économies de 12 mois consécutifs, mais le premier mois peut varier (par exemple: partir de janvier pour 12 mois, commencer à partir de mars pour 12 mois, etc.).Encore une autre LEFT OUTER JOIN échouer dans SQL Server 2012 Express
J'ai besoin d'un rapport qui me rapporte toutes les économies (par mois) pour une année donnée. Cela signifie que pour certaines économies de projet, si le mois de démarrage n'est pas janvier, alors certaines de ces économies de projet tomberont dans une année de rapport différente.
J'ai donc besoin d'une requête qui retournera tous les mois pour l'année du rapport en cours, et qui ne comporte aucun élément pour lequel un projet n'a pas de valeurs d'épargne pour ce mois.
J'ai quelques projets débutant en juillet, et je ne récupère que ces 6 mois avec leur valeur. C'est-à-dire que la gauche rejoint la date WITH n'est pas une connexion externe correcte. Quelqu'un peut-il me dire où je vais mal s'il vous plaît?
Code Voir ci-dessous:
DECLARE @MonthEndSnapshot SMALLDATETIME;
SELECT @MonthEndSnapshot = getdate()
DECLARE @StartDate SMALLDATETIME, @EndDate SMALLDATETIME;
SELECT @StartDate = FORMAT(@MonthEndSnapshot, 'yyyy') + '0101', @EndDate = FORMAT(@MonthEndSnapshot, 'yyyy') + '1231';
;WITH d(d) AS
(
SELECT
DATEADD(MONTH, n, DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate), 0))
FROM
(SELECT TOP
(DATEDIFF(MONTH, @StartDate, @EndDate) + 1)
n = ROW_NUMBER() OVER (ORDER BY [object_id]) - 1
FROM
sys.all_objects
ORDER BY [object_id]) AS n
)
select
left(datename(month, d.d), 3) as xAxisValueMon,
datepart(mm, d.d) as xAxisValue,
a.ProjectId as ProjectId,
ISNULL(SUM(a.Saving), 0) as yAxisValue
from
d
LEFT OUTER JOIN
(SELECT
mes.ProjectId, mes.Saving, mes.SavingMonth
FROM
dbo.sf_SnapshotMonthEndSaving() mes) AS a ON d.d = a.SavingMonth
group by
a.ProjectId, datename(month, d.d), datepart(mm, d.d)
order by
a.ProjectId, datepart(mm, d.d)
Le AVEC d (d) des œuvres de Pärt, et retourne 12 dates mois (1er mois de janvier à décembre).
J'ai essayé aussi la structure suivante comme la requête:
;WITH d(d) AS
(
SELECT DATEADD(MONTH, n, DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate), 0))
FROM (SELECT TOP (DATEDIFF(MONTH, @StartDate, @EndDate) + 1)
n = ROW_NUMBER() OVER (ORDER BY [object_id]) - 1
FROM sys.all_objects ORDER BY [object_id]) AS n
)
select left(datename(month, d.d), 3) as xAxisValueMon,
datepart(mm, d.d) as xAxisValue,
mes.ProjectId as ProjectId,
ISNULL(SUM(mes.Saving), 0) as yAxisValue
from d LEFT OUTER JOIN
dbo.sf_SnapshotMonthEndSaving() mes
ON d.d = mes.SavingMonth
group by mes.ProjectId, datename(month, d.d), datepart(mm, d.d)
order by mes.ProjectId, datepart(mm, d.d)
Mais mêmes résultats. Le tableau MonthEndSaving
est la suivante:
CREATE TABLE [dbo].[MonthEndSaving]
(
[MonthEndSavingId] [int] IDENTITY(1,1) NOT NULL,
[MonthEndSnapshot] [datetime] NOT NULL,
[ProjectId] [int] NOT NULL,
[SavingMonth] [datetime] NOT NULL,
[Saving] [money] NOT NULL,
[DateCreated] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED (MonthEndSavingId)
)
GO
ALTER TABLE MonthEndSaving
ADD CONSTRAINT [ProjectMonthEndSaving]
FOREIGN KEY (ProjectId) REFERENCES [dbo].[Project](ProjectId)
GO
Quelles sont les valeurs de 'mes.SavingMonth'? –
Le projetID sera uniquement affiché pour les mois où ce projet a une valeur "SavingMonth" qui correspond à un mois dans votre jeu 'd'. Si vous voulez que chaque ID de projet apparaisse, vous devrez les rejoindre sans condition. Votre condition doit être dans une instruction 'CASE' à l'intérieur de votre' SUM' si je comprends bien (par exemple 'ISNULL (SUM (cas où MES.SavingMonth = MONTH (dd) THEN mes.Saving ELSE 0 END), 0) '). – Kidiskidvogingogin
En se concentrant sur un seul ProjectId (qui commence à épargner à partir de juillet), vous prévoyez 12 enregistrements: un pour Jan, un pour Feb, un pour March, etc ... et vous attendez que ces 6 premiers enregistrements aient un montant nul et le 7ème et plus loin pour avoir les montants pertinents de la fonction de table. Droite? Et le problème est que vous n'avez que 6 enregistrements: un pour juillet, un pour août, un pour septembre, etc., chacun avec leurs montants respectifs. Est-ce que je comprends bien? – deroby