Подсчитать количество трасс и жить на основе месяца в SQL - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть следующая таблица в моей базе данных, где [дата начала] и [дата окончания] тип данных в 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, но у меня мало проблем с Живой колонкой, и, застряв на несколько дней, я почти сдался.

Живой столбец должен содержать значения столбца Trail за предыдущий месяц.Таким образом, столбец Live в феврале должен быть равен 2, то есть значениям Trail в январе.Извините за любую неопределенность

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 

Ответы [ 3 ]

0 голосов
/ 03 сентября 2010

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;
0 голосов
/ 23 октября 2013

ВЫБРАТЬ A. [MonthName], Trail, LIVE FROM

(ВЫБЕРИТЕ месяц (StartDate) как [MonthName], Trail = COUNT (месяц (StartDate)) ОТ SalesInvoice Группировка по месяцам (StartDate)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ

(ВЫБЕРИТЕ месяц (ENDDATE) как [MonthName], LIVE = COUNT (месяц (ENDDATE)) ОТ SalesInvoice Группировать по месяцам (ENDDATE)) B ON A. [MonthName] = B. [MonthName]

0 голосов
/ 03 сентября 2010

Лучшее, что я должен предложить, - это хранимая процедура (если ваш движок 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 ;
...