ByQuarter

From SQLZoo

Distribute values across quarters

schema:scott
DROP TABLE Insurance;DROP TABLE quarters;
CREATE TABLE Insurance (
  policynumber VARCHAR(10) NOT NULL PRIMARY KEY,
  premium INT,
  TransEff datetime,
  TransExp datetime
);
INSERT INTO Insurance VALUES ('PACA1',490,'2012-04-27','2013-04-27');
INSERT INTO Insurance VALUES ('PACA2',100,'2012-04-27','2012-08-05');
CREATE TABLE quarters(
  lo DATETIME NOT NULL PRIMARY KEY,
  hi DATETIME NOT NULL
);
INSERT INTO quarters VALUES ('2012-01-01','2012-04-01');
INSERT INTO quarters VALUES ('2012-04-01','2012-07-01');
INSERT INTO quarters VALUES ('2012-07-01','2012-10-01');
INSERT INTO quarters VALUES ('2012-10-01','2013-01-01');
INSERT INTO quarters VALUES ('2013-01-01','2013-04-01');
INSERT INTO quarters VALUES ('2013-04-01','2013-07-01');
INSERT INTO quarters VALUES ('2013-07-01','2013-10-01');
INSERT INTO quarters VALUES ('2013-10-01','2014-01-01');

In this example you want to distribute the income across several quarters

SELECT policynumber,datepart(YEAR,l1) y,datepart(quarter,l1) q,l1,h1,
  CASE WHEN l1>l2 THEN l1 ELSE l2 END AS maxstart,
  CASE WHEN h1>h2 THEN h2 ELSE h1 END AS minend
FROM
(SELECT policynumber,TransEff, 
  CAST(lo AS INT) l1,CAST(transeff AS INT)l2,CAST(hi AS INT)h1,
 CAST(transexp AS INT)h2
FROM Insurance JOIN quarters ON(hi>transeff AND lo<transexp)
) AS i;

SELECT policynumber,y,q,minend-maxstart
FROM(
SELECT policynumber,datepart(YEAR,l1) y,datepart(quarter,l1) q,l1,h1,
  CASE WHEN l1>l2 THEN l1 ELSE l2 END AS maxstart,
  CASE WHEN h1>h2 THEN h2 ELSE h1 END AS minend
FROM
(SELECT policynumber,TransEff, 
  CAST(lo AS INT) l1,CAST(transeff AS INT)l2,CAST(hi AS INT)h1,
 CAST(transexp AS INT)h2
FROM Insurance JOIN quarters ON(hi>transeff AND lo<transexp)
) AS i
) as x