У меня есть запрос, над которым я работал всю неделю. Я все еще новичок в этом, и я ценю помощь, которую я получил до сих пор.
Этот запрос извлекает данные из 3 таблиц, выводит их в представление, затем у меня есть второй запрос для форматирования данных так, как этого хочет босс. Проблема в том, что это должно работать на SAP B1, который, похоже, не поддерживает представления. Поэтому мне нужно написать это таким образом, чтобы сделать все это в одном запросе.
Вот первый запрос:
SELECT
t2.cardcode as 'BP_Code',
--t0.Recontact as 'Date',
t2.CardName as 'BP_Name',
SubString(T3.Name,1,2) as 'Salesman',
replace(T0.Street,',',' ') as 'Street_Address',
T0.City,
T0.State,
SUM(CASE WHEN YEAR(t0.recontact) = 2011 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2011',
SUM(CASE WHEN YEAR(t0.recontact) = 2012 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2012',
SUM(CASE WHEN YEAR(t0.recontact) = 2013 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2013',
convert(decimal(10,2),SUM(t0.U_sold)) as 'Total_Sold'
From
OCLG t0 -- OCLG is Activities
inner join OCRD t2 -- OCRD is Customer Definitions
on T0.cardcode like t2.cardcode
inner join OCLS t3 -- OCLS is Activity Definitions
on T0.CntctSbjct=T3.Code
where
t0.U_sold > 0
and T0.CntctSbjct=T3.Code
and T0.CardCode=T2.CardCode
and T0.CntctType='3'
and t2.CardCode = 'a239' --This was added to simplify output
and T0.Recontact >= Convert(date, '2011-01-01' ) and T0.Recontact <= Convert(date, '2013-12-31' )
group by t2.cardcode, t0.city, t0.state, t0.street, t2.CardName, T3.Name, t0.Recontact
order by t2.CardCode
Теперь это выдает таблицу, которая выглядит так:
BP_Code BP_Name Salesman Street_Address City State Year2011 Year2012 Year 2013 Total_Sold
A239 Buddy's 01 123 WASHINGTON WASHINGTON MO 8993.84 0.00 0.00 8993.84
A239 Buddy's 01 123 WASHINGTON WASHINGTON MO 16474.54 0.00 0.00 16474.54
A239 Buddy's 01 123 WASHINGTON WASHINGTON MO 0.00 7170.79 0.00 7170.79
A239 Buddy's 01 123 WASHINGTON WASHINGTON MO 0.00 9207.73 0.00 9207.73
A239 Buddy's 01 123 WASHINGTON WASHINGTON MO 0.00 0.00 6960.20 6960.20
A239 Buddy's 01 123 WASHINGTON WASHINGTON MO 0.00 0.00 6787.73 6787.73
Теперь я помещаю этот вывод в представление CallReport и запускаю для него этот запрос:
;WITH x AS
(
SELECT BP_Code, BP_Name, SalesMan, Street_Address,
s = SUM(Total_Sold) OVER (PARTITION BY BP_Code),
a = SUM(Year2011) OVER (PARTITION BY BP_Code),
b = SUM(Year2012) OVER (PARTITION BY BP_Code),
c = SUM(Year2013) OVER (PARTITION BY BP_Code),
r = ROW_NUMBER() OVER (PARTITION BY BP_Code ORDER BY Date DESC)
FROM CallReport
)
SELECT BP_Code, BP_Name, Salesman, Street_Address, Year2011 = a, Year2012 = b, Year2013 = c, Total_Sold = s
FROM x
WHERE r = 1 and Salesman = 01;
Затем я получаю желаемый результат:
BP_Code BP_Name Salesman Street_Address Year2011 Year2012 Year2013 Total_Sold
A239 Buddy's 01 123 WASHINGTON 25468.38 16378.52 13747.93 106804.83
Видите, в чем проблема? У меня есть сотни BP_Codes, я просто сужаю A239 для этого примера. Мне нужно, чтобы каждый BP_code находился только в одной строке с данными о сумме продаж за каждый год и общей суммой. Я знаю, что есть способ сделать это проще, но я все еще новичок в игре. Любые идеи? Это на MSSQL 2008 R2