WedX - журнал о программировании и компьютерных науках

Проблемы с удалением представления SQL

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

Этот запрос извлекает данные из 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

11.12.2013

Ответы:


1

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

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, replace(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
11.12.2013
  • Ты мой герой! Первый почти сработал (не могу поверить, что был так близок...), за исключением случаев, когда была разница в адресе. Второй работал отлично! 12.12.2013
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]