2012-04-20 4 views
3

Я на самом деле создаю отчет о Crystal Reports v12 (2008), но не могу найти метод, используя Crystal, для извлечения следующего. Я подумал, что если кто-то может ответить на языке SQL, я могу собрать его вместе.SQL, чтобы выбрать родительский элемент, который содержит дочернее значение

2 Таблицы: hbmast, ddmast выхода

SELECT hbmast.custno, hbmast.id, ddmast.name, ddmast.status 
WHERE hbmast.custno = ddmast.custno 
GROUP BY hbmast.id 
pseudo code::show all hbmast values that have ddmast.status = '2' 

Образца:

J0001, 111222, PAUL JONES, 1 
     111222, PAUL JONES, 2 
     111222, PAUL JONES, 1 

K0001, 555333, PETER KING, 3 
     555333, PETER KING, 1 

Я хотел бы иметь Пол шоу на отчете с всеми дочерними записями, но Питер не должен быть возвращен в докладе так как у него нет дочерних записей с «2» для поля ddmast.status.

Спасибо за помощь

ответ

2

Путь для достижения этой цели в кристалле будет иметь свой ХБ Д.Д. таблицы затем второй псевдоним таблицы дд.

Итак, вы должны отфильтровать таблицу псевдонимов dd, где status = 2, затем присоединитесь к своей таблице hb и вернитесь в таблицу dd (а не псевдоним). SQL будет в конечном итоге выглядит как:

select hb.custno, hb.id, dd.name, dd.status from hbmast hb 
inner join ddmast dd on hb.custno = dd.custno 
inner join ddmast dd2 on hb.custno = dd2.custno 
where dd2.status = '2' 

Andomar делает действительный пункт о повторяющихся записей, появляющихся при наличии более чем 1 запись в группе со статусом 2. Если это так, вы можете группировать по основным ключ и показать информацию о строках на уровне нижнего уровня группы ИЛИ использовать выражение sql с подзапросом в вашей формуле выбора вместо метода двойного соединения.

SQL Expression: (select count(*) from ddmast where custno = "hbmast.custno" and status = '2')

Затем запись эксперта выбор: {%sqlexpression} > 0

+0

Отличные ответы, и у вас есть решение. У меня мало результатов, поэтому я не буду беспокоиться о том, как исправить открытие Андомара. Я получил результаты, которые он описал. – macunte

+0

Как это может быть так? псевдоним dd2 даже не подключен во втором соединении. – xQbert

+0

@xQbert crystal использует графический дизайнер - включенный в него sql был всего лишь примером того, как кристалл переведет его :) Я исправил опечатку, хотя в любом случае –

4

Я думаю, что вы ищете это:

select hb.custno, hb.id, dd.name, dd.status from hbmast hb 
join ddmast dd on hb.custno = dd.custno 
where hb.custno in (
    select custno from ddmast 
    where status = '2' 
) 

Позвольте мне знать, если это возвращает свой ожидаемый результат.

1

И другой способ, чтобы получить то же самое ...

SELECT hb.custno, hb.id, dd.name, dd.status 
FROM hbmast hb 
INNER join ddmast dd 
    on hb.custno = dd.custno 
INNER JOIN DDMAST2 DD2 
    on DD2.custNo = HB.custNo 
    AND DD2.Status='2' 
+3

Это создало бы много повторяющихся строк, если есть более чем одна '' ddmast' за hbmast'. Решение Mosty 'where ... in' выглядит лучше – Andomar

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