Как я могу превратить этот оператор sql в оператор abap?

Select knvp.KUNNR, kna1.NAME1, knvp.PARVW, knvp.KUNN2
from landing.kna1 kna1,
landing.knvp knvp,
(Select kna1.KUNNR, COUNT(knvp.KUNN2) as count
from landing.KNA1 kna1
, landing.KNVP knvp
where kna1.KUNNR = knvp.KUNN2
and kna1.KTOKD in('ZPYR', 'ZBPR')
group by kna1.kunnr
having count(knvp.kunn2) < 2)as orphans
where kna1.KUNNR = knvp.KUNNR
and knvp.KUNNR = orphans.KUNNR

По сути, эта серия операторов sql помещает счетчик в тип таблицы kunr и отображает все числа, которые появляются в этой таблице только один раз.


Красиво распечатанная версия SQL-выражения (Эта версия прилагается — на случай, если некоторые важные детали потеряются из-за красивого распечатки):

SELECT knvp.kunnr, 
       kna1.name1, 
       knvp.parvw, 
       knvp.kunn2 
FROM   landing.kna1 kna1, 
       landing.knvp knvp, 
       (SELECT kna1.kunnr, 
               Count(knvp.kunn2) AS count 
        FROM   landing.kna1 kna1, 
               landing.knvp knvp 
        WHERE  kna1.kunnr = knvp.kunn2 
               AND kna1.ktokd IN ( 'ZPYR', 'ZBPR' ) 
        GROUP  BY kna1.kunnr 
        HAVING Count(knvp.kunn2) < 2) AS orphans 
WHERE  kna1.kunnr = knvp.kunnr 
       AND knvp.kunnr = orphans.kunnr 




im starting with this

rowNum     col1    col2    col3     col4
1          1234     bp     name1    1234
2          1234     py     name1    1234
3          1223     bp     name2    1223
4          1245     py     name3    1245
5          5432     py     name4    4432

i want to delete row# 1 and 2 because they have the same col1# but
different col2#

result:

rowNum     col1    col2    col3     col4
1          1223     bp     name2    1223
2          1245     py     name3    1245
3          5432     py     name4    5432

person lcs3.uapb    schedule 15.08.2012    source источник
comment
Я могу себе представить, что это возможно, но часто проще решить это с помощью последовательности select-команд и некоторой дополнительной переменной для хранения промежуточных результатов.   -  person knut    schedule 15.08.2012
comment
Хорошо, не могли бы вы привести мне пример, я новичок в программировании abap, я программирую всего около месяца.   -  person lcs3.uapb    schedule 15.08.2012
comment
Почему вы пометили это как mysql, так и sql-server, если вам нужен только ответ ABAP?   -  person vwegert    schedule 15.08.2012
comment
я действительно не знаю, что делает оператор sql. Я собирался попросить кого-нибудь объяснить, что он делает, но еще не спросил.   -  person lcs3.uapb    schedule 15.08.2012
comment
Что вы пытаетесь сделать - получить ключи КУННР (и некоторые дополнительные данные) для всех записей, у которых меньше двух записей с КУНН2 в КНВП?   -  person vwegert    schedule 16.08.2012
comment
Я могу сказать вам, что он делает — сбивает с толку всех, кто пытается его расшифровать. :-)   -  person vwegert    schedule 16.08.2012
comment
Я все еще пытаюсь понять SQL. landing. нужен? или просто запутать читателя? Вы используете две таблицы KNA1 и KNVP в выборе, но я не вижу JOIN.   -  person knut    schedule 16.08.2012
comment
Да, это то, что я пытаюсь сделать, но в ABAP.   -  person lcs3.uapb    schedule 16.08.2012
comment
Кнут, это не Open SQL. Я бы сказал, что кто-то вырвал несколько таблиц из установки R/3 и засунул их в базу данных MySQL с именем Landing или что-то в этом роде.   -  person vwegert    schedule 16.08.2012
comment
@knut, я мало что знаю об операторах sql. мне было дано сделать отчет abap о тех же данных, которые производит оператор sql, но с помощью abap. если это имеет смысл.   -  person lcs3.uapb    schedule 16.08.2012


Ответы (1)


Вы могли бы попробовать

SELECT knvp~kunnr
       kna1~name1
       knvp~parvw
       knvp~kunn2
FROM kna1 JOIN knvp ON kna1~kunnr = knvp~kunnr
INTO TABLE lt_some_table_with_matching_structure
WHERE knvp~kunnr IN ( SELECT kna1~kunnr
                      FROM kna1 JOIN knvp ON kna1~kunnr = knvp~kunn2
                      WHERE ( kna1~ktokd = 'ZPYR' OR kna1~ktokd = 'ZBPR' )
                      GROUP BY kna1~kunnr
                      HAVING COUNT( DISTINCT knvp~kunn2 ) < 2 ).

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

РЕДАКТИРОВАТЬ: с дополнительной информацией из вашего комментария вы можете попробовать что-то вроде этого:

DATA: lt_partners TYPE TABLE OF kunnr. " unsure whether this is the correct type

SELECT kunnr 
  FROM kna1
  INTO TABLE lt_partners
  WHERE ( kna1~ktokd = 'ZPYR' OR kna1~ktokd = 'ZBPR' ).
  " AND probably some other filter criteria
SORT lt_partners.
DELETE ADJACENT DUPLICATES FROM lt_partners. " avoid DISTINCT if you can to take load off the database

IF lt_partners IS NOT INITIAL.
  SELECT knvp~kunnr
         kna1~name1
         knvp~parvw
  FROM kna1 JOIN knvp ON kna1~kunnr = knvp~kunnr
  INTO TABLE lt_some_table_with_matching_structure
  FOR ALL ENTRIES IN lt_partners
  WHERE knvp~kunn2 = lt_partners-table_line
  GROUP BY knvp~kunnr kna1~name1 knvp~parvw
  HAVING COUNT( DISTINCT knvp~kunn2 ) < 2.
ENDIF.

Имейте в виду, что вы не можете выбрать KNVP~KUNN2 на этом шаге, потому что вам придется включить его в предложение GROUP BY, и тогда предложение HAVING не будет работать. (Сейчас у меня нет доступной системы, так что опять же, это догадки...)

person vwegert    schedule 15.08.2012
comment
Это помогло, но дало те же результаты для кода, что и у меня. - person lcs3.uapb; 16.08.2012
comment
...так? Я предположил, что вы хотели, чтобы он вернул те же результаты? Или я неправильно понял ваш комментарий? - person vwegert; 16.08.2012
comment
Это помогло, но дало те же результаты для кода, что и у меня. Он вытягивает и сравнивает правильные данные, но не дает мне результата, который я ищу. я хочу использовать какой-то счетчик для подсчета kunr#, у которого есть один партнер. Для тех, к которым подключен один партнер#, выведите этот kunr#. информация, которую я получаю сейчас, это все kunnr# с двумя партнерами#, связанными с ними, я пытаюсь найти способ просто выбрать kunnr# с подключенным к нему партнером. это имеет больше смысла. - person lcs3.uapb; 16.08.2012
comment
Я работаю над этим, пытаясь заставить его работать, и я дам вам знать, как это происходит. - person lcs3.uapb; 16.08.2012
comment
привет, vwegert, я пробовал это решение и модифицированную часть решения, но оно все еще не дает мне ответа, который я ищу, я думаю, я собираюсь проиллюстрировать, с чего я начинаю и чем я хочу закончить. - person lcs3.uapb; 16.08.2012