2013-12-11 4 views
0

У меня есть запрос, который я работал всю неделю. Я все еще новичок в этом, и я ценю помощь, которую я получил до сих пор.Устранение неполадок SQL View

Этот запрос вытаскивает данные из трех таблиц, выгружает их в виде, затем у меня есть второй запрос для форматирования данных так, как хочет его босс. Проблема в том, что это должно работать в 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

ответ

0

Если я понял это правильно у пытаются изменить представление, чтобы получить желаемый результат, ниже приведен код для этого

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, replace(T0.Street,',',' '), t2.CardName, SubString(T3.Name,1,2) 
order by t2.CardCode 

все, что я сделал, чтобы исправить положение GroupBy , вы получали несколько записей из-за t0.Recontact в группе.

Если у вас есть несколько значений в t0.city, t0.state, замените (T0.Street, ',', ''), t2.CardName, SubString (T3.Name, 1,2) столбцы для BP_Code и вы хотите выбрать одно из значений этих столбцов, используйте ниже код

SELECT 
t2.cardcode as 'BP_Code', 
--t0.Recontact as 'Date', 
max(t2.CardName) as 'BP_Name', 
max(SubString(T3.Name,1,2)) as 'Salesman', 
max(replace(T0.Street,',',' ')) as 'Street_Address', 
max(T0.City) City, 
max(T0.State) 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 
order by t2.CardCode 
+0

Ты мой герой! Первый почти сработал (я не могу поверить, что был так близок ...), за исключением случаев, когда в адресе была разница. Вторая работала отлично! – user3059028

+0

рад, что это сработало :) – sam

Смежные вопросы