2016-02-15 2 views
1

В настоящее время у меня есть таблица, состоящая из цен.SQL, создающий таблицу цен

Столбцы PriceList, ItemCode, DiscountLine, Amount, Price.

E.G.

*1 , ITEM1 , 0 , 100 , 0.50 
*1 , ITEM1 , 1 , 200 , 0.45 
1234 , ITEM1 , 0 , 100 , 0.45 
1234 , ITEM1 , 1 , 100 , 0.40 

Проблема заключается в том, PriceList может быть либо прейскурант (предшествует *) или номер клиента.

Мне нужен результат в одной строке;

так

CUSTOMER ITEM AMOUNT0 PRICE0 AMOUNT1 PRICE1 
1234  ITEM1 100  0.45  200  0.40 

для этого я использую следующий код:

select Customer.CardCode ,Customer.CardName,SP.* from Customer inner join (
select ItemCode,CardCode, 
    max(case when DPNum=0 then Amount end) Amount1, 
    max(case when DPNum=0 then Price end) Price1, 
    max(case when DPNum=1 then Amount end) Amount2, 
    max(case when DPNum=1 then Price end) Price2, 
    max(case when DPNum=2 then Amount end) Amount3, 
    max(case when DPNum=2 then Price end) Price3, 
    max(case when DPNum=3 then Amount end) Amount4, 
    max(case when DPNum=3 then Price end) Price4, 
    max(case when DPNum=4 then Amount end) Amount5, 
    max(case when DPNum=4 then Price end) Price5, 
    max(case when DPNum=5 then Amount end) Amount6, 
    max(case when DPNum=5 then Price end) Price6, 
    max(case when DPNum=6 then Amount end) Amount7, 
    max(case when DPNum=6 then Price end) Price7, 
    max(case when DPNum=7 then Amount end) Amount8, 
    max(case when DPNum=7 then Price end) Price8, 
    max(case when DPNum=8 then Amount end) Amount9, 
    max(case when DPNum=8 then Price end) Price9, 
    max(case when DPNum=9 then Amount end) Amount10, 
    max(case when DPNum=9 then Price end) Price10 
from SPP2 group by ItemCode,CardCode 
) sp 
on sp.CardCode = Customer.CardCode or sp.CardCode = '*'+cast(ListNum as varchar(1)) 
where Customer.Cardcode='1234' 
order by Customer.CardCode,ItemCode,sp.CardCode DESC 

Это работает, кроме одной маленькой детали; Если у клиента есть прейскурант (и все клиенты делают) И у них «особые» цены; Я получаю 2 строки за элемент.

так Мой результат был бы:

CUSTOMER NAME ITEM PLCODE AMOUNT0 PRICE0 AMOUNT1 PRICE1 
1234  DUMMY ITEM1 1234  100  0.45  200  0.40 
1234  DUMMY ITEM1 *1  100  0.50  200  0.45 

Если клиент имеет специальную цену, только это должно быть возвращено. Есть ли способ сделать это в одном запросе? (или, возможно, есть более эффективный способ делать то, что я пытаюсь выполнить)?

+2

«Проблема в том, что PriceList может быть либо прейскурантом (которому предшествует *), либо номером клиента». - Да, это действительно ошибка дизайна. –

+0

Да, вы правы. К сожалению, хорошие люди в SAP сделали эту ошибку дизайна. – Rknabben

+0

Здесь хорошее место для начала. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

ответ

3

Вы можете использовать row_number(), чтобы получить одну строку на одного клиента. Вот идея:

select csp.* 
from (select c.*, sp.*, 
      row_number() over (partition by customer 
           order by (case when plcode like '*_' then 1 else 2 end) 
           ) as seqnum 
     from customer c join 
      (select ItemCode, CardCode, 
        max(case when DPNum=0 then Amount end) Amount1, 
        max(case when DPNum=0 then Price end) Price1, 
        . . . 
      from SPP2 
      group by ItemCode, CardCode 
      ) sp 
      on sp.CardCode = Customer.CardCode or sp.CardCode = '*'+cast(ListNum as varchar(1)) 
     where c.Cardcode = '1234' 
    ) csp 
where seqnum = 1; 
+1

Да, это уродливый неэффективный запрос, который вы получаете при разработке таблиц неправильный путь. –

+0

Обязательно сообщите об этом команде дизайнеров SAP B1 :) TT – Rknabben

+0

С некоторыми незначительными трюками я получил его на работу, благодаря Гордону Линоффу! – Rknabben