0

我的数据库中有下表,其中[开始日期][结束日期] 数据类型为日期 时间

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 专栏上遇到了一些问题,并且在被卡住了几天之后,我几乎放弃了。

Live Column 应包含上个月 Trail 列的值。因此,二月份的 Live 列应该是 2,即一月份的 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

我必须建议的最好的事情是存储过程(如果您的 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 回答
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

SELECT A.[MonthName],Trail,LIVE FROM

(SELECT month(StartDate) as [MonthName], Trail = COUNT(month(StartDate)) FROM SalesInvoice Group by month(StartDate)) INNER JOIN

(SELECT month(ENDDATE) as [MonthName], live = COUNT(month(ENDDATE)) FROM SalesInvoice Group by month(ENDDATE)) B ON A.[MonthName] = B.[MonthName]

于 2013-10-23T06:05:47.077 回答