Member 13278062 Ответов: 1

Как создать сводный запрос в SQL server без агрегатной функции


Я использую MS SQL SERVER и у меня есть следующие данные:

ValDate Месяц CurID SpotRate_Cad
11/1/2016 11 САПР 1.00000000
11/1/2016 11 долларов 1.30000000
11/1/2016 11 евро 1.51000000
11/2/2016 11 САПР 1.00000000
11/2/2016 11 долларов 1.31000000
11/2/2016 11 евро 1.50000000

Я хотел бы иметь такой формат

Дата месяц канадский доллар в американский доллар евро
11/1/2016 11 1.00000000 1.30000000 1.51000000
11/1/2016 11 1.00000000 1.31000000 1.50000000

Что я уже пробовал:

ВЫБИРАТЬ *
ОТ (
Выберите ЧДД.ValDate, месяц(ЧДД.ValDate) как месяц, функция rtrim(ЧДД.CurID) как CurID, доход (NPV.SpotRate) как SpotRate_Cad

От boss_bo.dbo.NPVPLFxRate как npv
Левое соединение boss_bo.dbo.NPVPLFxRate как npv2
На доход (NPV.ValDate =npv2.ValDate)

Где (npv. ValDate<= '2017-06-20')
И (npv. ValDate>= '2016-11-01')
А (npv2.CurID = "США")
) валютные

СТЕРЖЕНЬ (
ValDate, Месяц, SpotRate
Для CurID в
([САПР], [долларов], [евро])
) КАК РЯДОВОЙ

Andy Lanng

Не используйте pivot. То, что вы хотите, не является функцией pivot.

Kornfeld Eliyahu Peter

У вас всегда есть фиксированное количество валют для слияния?

1 Ответов

Рейтинг:
2

FranzBe

CREATE TABLE #thetable 
( id            INT IDENTITY(1,1) NOT NULL ,
ValDate         DateTime,
[Month]         INT,
CurID           CHAR(3),
SpotRate        FLOAT
)

INSERT INTO #thetable (ValDate, [Month], CurID, SpotRate) VALUES ('11/1/2016',11, 'cad', 1.0)
INSERT INTO #thetable (ValDate, [Month], CurID, SpotRate) VALUES ('11/1/2016',11, 'usd', 1.3)
INSERT INTO #thetable (ValDate, [Month], CurID, SpotRate) VALUES ('11/1/2016',11, 'eur', 1.51)
INSERT INTO #thetable (ValDate, [Month], CurID, SpotRate) VALUES ('11/2/2016',11, 'cad', 1.0)
INSERT INTO #thetable (ValDate, [Month], CurID, SpotRate) VALUES ('11/2/2016',11, 'usd', 1.31)
INSERT INTO #thetable (ValDate, [Month], CurID, SpotRate) VALUES ('11/2/2016',11, 'eur', 1.5)


SELECT * FROM #thetable

SELECT
   dateadd(day,datediff(day,0, t.ValDate ),0) as DATE
   ,[Month]
   ,SUM(cad) as cad
   ,SUM(usd) as usd
   ,SUM(eur) as eur
FROM
(
SELECT
  ValDate
  ,[Month]
  ,CASE WHEN CurID = 'cad' THEN SpotRate END AS 'cad'
  ,CASE WHEN CurID = 'usd' THEN SpotRate END AS 'usd'
  ,CASE WHEN CurID = 'eur' THEN SpotRate END AS 'eur'
FROM  #thetable
) t
GROUP BY 
dateadd(day,datediff(day,0, t.ValDate ),0)
,[Month]