Compter le nombre de pistes et de vivre en fonction d'un mois dans SQL
Question
Je le tableau suivant dans ma base de données où [date de début] et [Date de fin] type de données est datetime
CompanyID ServiceStartDat BillingStartDate
1 03/01/2010 03/02/2010
2 12/01/2010 12/02/2010
3 15/02/2010 15/03/2010
4 28/02/2010 28/03/2010
5 04/03/2010 04/04/2010
6 04/04/2010 04/05/2010
7 29/04/2010 29/05/2010
8 07/05/2010 07/06/2010
15 30/08/2010 30/09/2010
16 31/08/2010 31/09/2010
---------- ---------- ----------
155 01/09/2010 01/10/2010
Dans le tableau ci-dessus que je veux produire le tableau ci-dessous. J'ai réussi à obtenir la colonne Trail correctement mais je rencontre quelques problèmes avec la colonne en direct et après avoir été bloqué pendant quelques jours, j'ai pratiquement renoncé.
La colonne en direct doit contenir les valeurs de la colonne Trail dans le mois précédent. Ainsi, la colonne en direct en Février devrait être 2 qui est des valeurs Trail en Janvier. Désolé pour toute ambiguïté
use testDB
Go
SELECT month(StartDate) as [MonthName],
Trail = COUNT(month(StartDate))
FROM mytable
Group by month(StartDate)
Je veux que la requête pour produire le tableau suivant
MonthName Trail Live
Jan 2 0
Feb 2 2
Mar 1 4
Apr 2 5
May 1 7
Jun 0 7
Jul 0 7
Aug 2 9
Sep 1 10
La solution
est une procédure stockée la meilleure chose que je dois proposer (si vous le moteur MySQL leur permet)
DELIMITER $$
DROP PROCEDURE IF EXISTS `getTrailAndLive` $$
CREATE PROCEDURE `getTrailAndLive` ()
BEGIN
DECLARE i INTEGER;
CREATE TEMPORARY TABLE `liveTable` (
`liveMonthId` INTEGER UNSIGNED NOT NULL,
`liveValue` INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (`liveMonthId`)
);
SET i = 1;
labelLoop: LOOP
INSERT INTO `liveTable` SELECT i, COUNT(*) FROM `myTable` WHERE MONTH(startdate) < i;
SET i = i + 1;
IF(i < 13) THEN ITERATE labelLoop;
END IF;
LEAVE labelLoop;
END LOOP labelLoop;
SELECT MONTH(startdate) AS MonthId, COUNT(*) AS Trail, liveValue AS Live
FROM `myTable`, `liveTable`
WHERE liveMonthId=MONTH(startdate)
GROUP BY MONTH(startdate);
DROP TABLE IF EXISTS `liveTable`;
END $$
DELIMITER ;
Autres conseils
Pierroz Merci infiniment!
J'ai modifié votre code un peu et cela a fonctionné un régal. Tout ce que je cherchais
ici est le code final
use testDB
Go
CREATE PROCEDURE [dbo].[getTrailAndLive]
AS
SET nocount ON
IF EXISTS(
SELECT name FROM [testDB]..sysobjects
WHERE name = '#liveTable' AND xtype='U') DROP TABLE [dbo].[#liveTable];
CREATE table #liveTable(
liveMonthId int,
liveValue int
PRIMARY KEY (liveMonthId)
);
DECLARE @i int;
SET @i = 1;
WHILE @i <13
BEGIN
INSERT INTO #liveTable SELECT @i, COUNT(*) FROM myTable WHERE MONTH(startDate) < @i;
SET @i = @i + 1;
END
SELECT MONTH(startDate) AS MonthId, COUNT(*) AS Trail, liveValue AS Live
FROM myTable, #liveTable
WHERE liveMonthId=MONTH(startdate)
GROUP BY MONTH(startDate), liveValue;
DROP TABLE #liveTable;
SELECT A. [MonthName], Trail, en direct de
(mois SELECT (StartDate) comme [MonthName], Trail = COUNT (mois (StartDate)) DE SalesInvoice Groupe par mois (StartDate)) A INNER JOIN
(mois SELECT (ENDDATE) comme [MonthName], = COUNT vis (mois (ENDDATE)) DE SalesInvoice Groupe par mois (ENDDATE)) BMARCHE A. [MonthName] = B. [MonthName]