0

データベースに次のテーブルがあり、[開始日][終了日] のデータ型は 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 

上記の表から、下の表を作成したいと思います。Trail 列を正しく取得することができましたが、Live 列にはほとんど問題がなく、数日間立ち往生した後、ほとんどあきらめました。

ライブ列には、前月の Trail 列の値が含まれている必要があります。したがって、2 月の Live 列は 2 である必要があり、これは 1 月の Trail Values です。あいまいで申し訳ありません

use testDB
Go
SELECT month(StartDate) as [MonthName],
Trail = COUNT(month(StartDate))
FROM mytable 
Group by month(StartDate)

クエリで次のテーブルを生成したい

 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 
4

3 に答える 3

0

PierrOZ いつもありがとうございます!
私はあなたのコードを少し修正しましたが、うまくいきました。ちょうど私が探していたもの

ここに最終的なコードがあります

    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;
于 2010-09-03T14:03:31.487 に答える
0

私が提案しなければならない最善のことは、ストアドプロシージャです(MySQLエンジンが許可している場合)

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 ;
于 2010-09-03T12:00:57.980 に答える