J'ai donc 2 colonnes de date, début et fin. Ce que j'essaie d'accomplir est l'inventaire de chaque jour et cela reviendra au début de 2020 afin que j'ai ces champs:
Date de début, le nombre de nouvelles ajoute ce jour-là, compte de la fermeture de ce jour-là et comptez d'open existant des jours précédents. Ma structure de données de base que je dérive est la date de début, la date de fin, le type de demande (si la date de début = la date du rapport et la date de fin est NULL, alors "Nouvelle addition", si la date de fin n'est pas nulle, alors "travail fermé" et si la date de début est ". moins que la date du rapport puis «Open existant». Le problème est que ceux-ci dépendent de la relativité entre la date du rapport et des dates ouvertes / fermées. Je dois être capable de regrouper à la date et de donner les comptes pour chaque jour. J'ai essayé ces 2 solutions et ne fonctionnait pas comme si j'avais espéré comme il est légèrement différent de mon scénario. ( Comptez la fonction sur plusieurs colonnes par date (SQL Server) et Obtenez un compte sur deux colonnes de date et groupe par date et groupe par date ). Quand je me résume, j'ai besoin de faire un compte à chaque jour en fonction de la date actuelle. Inventaire et les trucs existants du P Jour réel. p>
Ma structure de données de base est comme celle-ci et que de fausses données: p> résultat attendu: p>
3 Réponses :
Il s'agit d'un début d'une solution qui corrige la logique à gérer toute date du rapport: Vous avez besoin d'une expression de cas qui vous donnera l'une des trois valeurs. P> Une fois que vous avez travaillé pendant une date de rapport unique, vous pouvez générer une gamme de dates de rapport en utilisant cette solution et la joindre à votre table: génère des dates entre les chaînes de date p> p>
set @report_start = '20200101';
set @report_end = '20200103';
select
d.dt,
count(case when t.start_dt = d.dt then 1 end) as Adds,
count(case when d.dt > t.start_dt and d.dt < t.end_dt as Existing,
count(case when t.end_dt = d.dt then 1 end) as Closed
from T t inner join Dates d on d.dt <= coalesce(t.end_dt, @report_end)
where d.dt between @report_start and @report_end
group by d.dt;
Create a table of dates and join against it. Counting is fairly easy at that point.This is a bad idea because you need to count up across all dates ever. Also I don't know what null end date means. Apologies if this is sloppy as I typed it on my phone.
NULL date signifie que la demande est toujours ouverte. C'est pourquoi j'ai besoin de pouvoir compter celles-ci jusqu'à ce qu'il soit fermé. Donc, si la 1ère rangée est reportée au lendemain, je peux dire dans la sortie qu'il existe.
Cela fonctionne presque, à l'exception de l'existant n'est pas compté juste parce qu'à partir d'aujourd'hui, il y a 0 existant, mais je compte à la main dans Excel Plus de 63 000 demandes encore ouvertes (anciens inventaires passant de jour en jour). Je tente de comprendre pourquoi maintenant. Celles-ci ont toujours des journées fermées nulles, ce qui signifie qu'ils sont toujours ouverts des demandes. Merci d'avoir m'aidé avec cette demande folle que je travaille.
Pour mettre en œuvre ma solution, ajoutez une table où je gère le calendrier
Vous devez faire plusieurs étapes pour résoudre le problème: P>
Je combine enfin tous les totaux avec le calendrier p>
Cette requête répond aux conditions p>
Il est clair à 50%. Pourquoi je compte? Vous auriez dû donner au moins 10 jours de données.