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 
Était-ce utile?

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]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top