Utilisation de PIVOT pour les dates à convertir en MTD, QTD, YTD

J'ai une table qui ressemble à quelque chose comme ci-dessous

Dates Start Date End Code Type Values Jan-14 Dec-14 AccountCode A1 0.005 Oct-14 Dec-14 AccountCode A1 0.001 Dec-14 Dec-14 AccountCode A1 0.0017 Jan-14 Dec-14 AccountCode A2 -0.004832912 Oct-14 Dec-14 AccountCode A2 -0.002195574 Dec-14 Dec-14 AccountCode A2 -0.001396166 

Besoin d'écrire une requête où je peux convertir en utilisant pivot à

 displayperiod A1 A2 YTD 0.005 -0.004832912 QTD 0.001 -0.002195574 MTD 0.0017 -0.001396166 

Je suis actuellement coincé dans la conversion des dates à YTD, MTD et QTD.

Toute aide est grandement appréciée.

******************** Ajout de plus d'éléments de données Données pour Jan

  SELECT * FROM mytable WHERE AND data_enddate = '20140131' ORDER BY type, data_startdate Output from table data_startdate data_enddate factor_name value 1/1/2014 1/31/2014 A1 0.0018 1/1/2014 1/31/2014 A2 0.0024 In this case MTD = YTD = QTD hence the output required displayperiod A1 A2 YTD 0.0018 0.002 QTD 0.0018 0.002 MTD 0.0018 0.002 

Données pour février

  SELECT * FROM mytable WHERE AND data_enddate = '20140228' ORDER BY type, data_startdate Output from table data_startdate data_enddate factor_name value 1/1/2014 2014-02-28 A1 0.0011 1/2/2014 2014-02-28 A1 0.0024 1/1/2014 2014-02-28 A2 0.0021 1/2/2014 2014-02-28 A2 0.0034 In this case MTD = QTD ,YTD hence the output required displayperiod A1 A2 YTD 0.0024 0.0034 QTD 0.0011 0.0021 MTD 0.0011 0.0021 

Données pour Mar

  SELECT * FROM mytable WHERE AND data_enddate = '20140331' ORDER BY type, data_startdate Output from table data_startdate data_enddate factor_name value 1/1/2014 2014-03-31 A1 0.0011 1/3/2014 2014-03-31 A1 0.0024 1/1/2014 2014-02-28 A2 0.0021 1/2/2014 2014-02-28 A2 0.0034 

Dans ce cas MTD, QTD = YTD

  hence the output required displayperiod A1 A2 YTD 0.0011 0.0021 QTD 0.0011 0.0021 MTD 0.0024 0.0034 

Données pour avr

  SELECT * FROM mytable WHERE AND data_enddate = '2014-04-30' ORDER BY type, data_startdate Output from table data_startdate data_enddate factor_name value 1/1/2014 2014-04-30 A1 0.0011 1/4/2014 2014-04-30 A1 0.0024 1/1/2014 2014-04-30 A2 0.0021 1/4/2014 2014-04-30 A2 0.0034 In this case MTD , QTD=YTD hence the output required displayperiod A1 A2 YTD 0.0011 0.0021 QTD 0.0011 0.0021 MTD 0.0024 0.0034 

Données pour mai

  SELECT * FROM mytable WHERE AND data_enddate = '2014-04-30' ORDER BY type, data_startdate Output from table data_startdate data_enddate factor_name value 1/1/2014 2014-05-31 A1 0.0011 1/4/2014 2014-05-31 A1 0.0024 1/5/2014 2014-05-31 A1 0.0030 1/1/2014 2014-05-31 A2 0.0021 1/4/2014 2014-05-31 A2 0.0034 1/5/2014 2014-05-31 A2 0.0032 In this case MTD , QTD,YTD hence the output required displayperiod A1 A2 YTD 0.0011 0.0021 QTD 0.0024 0.0034 MTD 0.0030 0.0032 

Données pour juin

Juin aura 3 rangées

données pour juillet

Juillet aura 2 lignes où MTD = QTD et séparé YTD

Données pour août

AUG aura 2 lignes où MTD = QTD et distinct YTD

Les données pour Sept SEPt auront 3 lignes

Les données pour octobre oct auront 2 lignes où MTD = QTD et distinct YTD

Données pour NOV

Nov aura 3 rangées

données pour DEC

Dec aura 3 rangées

Recherchez la différence de month entre la date de start et la date de end dans la requête de source pivot pour get la période d' displayperiod aide de l'instruction case . Essaye ça.

 ;WITH cte AS (SELECT Cast('01-' + Dates_Start AS DATE) Date_Start, Cast('01-' + Date_End AS DATE) Date_End, code,type,value FROM yourtable) SELECT CASE WHEN Datediff(mm, Date_Start, Date_End) + 1 = 12 THEN 'YTD' WHEN Datediff(mm, Date_Start, Date_End) + 1 = 3 THEN 'QTD' WHEN Datediff(mm, Date_Start, Date_End) + 1 = 1 THEN 'MTD' END AS displayperiod, [A1], [A2] FROM cte PIVOT (Max(value) FOR type IN ([A1], [A2]))pv 

FIDDLE DEMO

Cela a fonctionné ici est la réponse

  SELECT * INTO #temp FROM ( SELECT startdate , endate , factor_name,consortingbution FROM myTable WHERE account_code = 'myaccount' and endate = '20140228' AND startdate IN ( SELECT DATEADD(yy, DATEDIFF(yy,0,'20140228'), 0) AS StartOfYear) UNION ALL SELECT startdate , endate , factor_name,consortingbution FROM myTable WHERE account_code = 'myaccount' and endate = '20140228' AND startdate IN ( SELECT DATEADD(q, DATEDIFF(q, 0, '20140228'), 0) ) UNION ALL SELECT startdate , endate , factor_name,consortingbution FROM myTable WHERE account_code = 'myaccount' and endate = '20140228' AND startdate IN (SELECT DATEADD(mm, DATEDIFF(mm, 0, '20140228'), 0) ) ) AS tmp