2014-02-11 2 views
-1

Я знаю, как вычитать в sql, но в моем случае это своего рода сложная задача.Как я могу вычитать в SQL

У меня после DB

Table1

id........artnumber.......price.......flag.......cid 
1   12345001  1200  L   9999 
2   12345002  2000  L   9999 
3   12345003  500   L   7777 
4   12345004  1950  L   6666 
01  500   R   9999 
02  1000  R   6666 
03  500   R   9999 

Table2

id........artnumber.......comment 
01  12345001 
02  12345004 
03  12345001 

, что им пытаются это: я хочу, чтобы выбрать все entrys из table1, имеющих L флаг на в результате этого я хочу вычесть цены с R флаг с L флаг. но только тот, кто имеет свой artnumber в комментарии table2

Результат я хочу

artnumber.......price.......flag.......cid 
12345001  200   L   9999 //her was 2 R flagged items substracted 
12345002  2000  L   9999 //her was nothing substracted 
12345003  500   L   7777 //her was nothing substracted 
12345004  950   L   6666 //her was 1 R flagged item substracted 

ли кто-нибудь знает, как настроить SQLStatement для этого?

я нашел несколько на другом потоке, но это не очень помогает мне :)

+0

Вам нужно несколько подключений, и вам нужно лучше определить «в комментарии». –

+0

Я знаю, что мне нужно присоединяться :) его тоже сложно объяснить, что я хочу :) im стараюсь изо всех сил, поэтому я публикую результат, я хочу иметь – Dwza

+0

Имеет ли каждый artnumber один максимум L и один R? Подойдя ближе, это сложнее. Может ли artnumber из таблицы 2 иметь дубликаты? – Mathmagician

ответ

1

Это кажется немного напуганным, но здесь идет. Я думаю, что это поможет вам, что вы ищете:

SELECT a.artnumber, a.price - SUM(IFNULL(b.price, 0)) price, a.flag, a.cid 
FROM Table1 a 
    LEFT JOIN (Table1 b INNER JOIN Table2 ON Table2.artnumber = b.artnumber AND b.flag = 'R') 
    ON Table2.comment = a.artnumber 
WHERE a.flag = 'L' 
GROUP BY a.artnumber, a.price, a.flag, a.cid 

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

Кроме того, в зависимости от ваших типов, я не уверен, что вам нужно будет CAST, чтобы это поле комментариев совпало. Там могут быть некоторые соображения. Я также делаю предположения о уникальности ваших записей. Другими словами, я полагаю, что artnumber и flag вместе составляют уникальную запись.

+0

выглядит сложным и приятным ... я дам этому попробовать – Dwza

+0

, так что этот работает почти нормально ... ISNULL возвращает ошибку (неверный счетчик в вызове функции native ISNULL), но когда я беру это один из моих результатов, которые я хочу. единственное, чего не хватает, если ther не вычитать, значение равно NULL, и если я использую его с ISNULL (b.price), у меня есть -1 для всех вычитаемых результатов nun: D – Dwza

+0

@Dwza Упс, вы используете MySQL , Вместо этого попробуйте 'IFNULL'. – Manny

1

Это ваши данные по ценам на L:

select l.artnumber, l.price, l.flag 
from table1 l 
where l.flag = 'L'; 

Это ваши данные по ценам на R:

select x.comment as artnumber, sum(r.price) 
from table1 r 
inner join table2 x on x.artnumber = r.artnumber 
where r.flag = 'R'; 

Вместе:

select 
    l_data.artnumber, 
    l_data.price - (case when r_data.sum_price is null then 0 else r_data.sum_price end) as calc_price, 
    l_data.flag, 
    l_data.cid 
from 
(
    select l.artnumber, l.price, l.flag, l.cid 
    from table1 l 
    where l.flag = 'L' 
) l_data 
left join 
(
    select x.comment as artnumber, sum(r.price) 
    from table1 r 
    inner join table2 x on x.artnumber = r.artnumber 
    where r.flag = 'R' 
) r_data on r_data.artnumber = l_data.artnumber; 
+0

спасибо за это, но я чувствую себя странно странным, когда вижу этот код :) Я предпочитаю что-то короче, может быть: D – Dwza

+0

Вы к этому не привыкли. Довольно часто выбирать из подзапросов, и это может значительно повысить удобочитаемость после того, как ваши утверждения станут намного больше. Да, первый подзапрос невозможен. Если вы замените его простым предложением FROM, оператор становится намного короче. Я просто хотел показать, как перейти от простых утверждений к составленному. Вы можете использовать эту технику, когда задача кажется очень сложной.Напишите небольшие операторы, а затем объедините их. CASE WHEN очень длинный для того, что он на самом деле делает здесь, но кроме isnull, ifnull, nvl и т. Д., Это стандартный SQL. –

+0

Еще одно замечание: при работе с большими таблицами некоторые запросы имеют тенденцию быть очень медленными, и нужно искать способы их оптимизации. Мое утверждение должно быть очень быстрым, потому что агрегация происходит до объединения. Это может существенно повлиять на производительность. Просто то, что вы, возможно, захотите запомнить в будущем :-) –

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