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