2016-12-15 1 views
2

나는 모든 가격 값은 다음 0을 어디에 GROUPID의 인스턴스를 찾기 위해 나는 곳 모두 모두 GROUPID를 찾으려면 다음 쿼리를 사용하려고 시도하고있는 무슨 내가그룹 내에서 동등 값을 찾으려면자가 조인을 어떻게 사용할 수 있습니까?

-------------------------------- 
| Groupid | Price | Customer| 
-------------------------------- 
| 001  | 9  | 4  | 
| 001  | 0  | 4  | 
| 002  | 4  | 4  | 
| 002  | 4  | 4  | 
| 003  | 0  | 4  | 
| 003  | 0  | 4  | 
| 004  | 4  | 4  | 
| 004  | 7  | 4  | 
-------------------------------- 

에서 찾고의 단순화 된 버전입니다 찾고 있어요 특정 그룹에 대한 가격 값 = 0

SELECT * FROM MYTABLE WHERE GROUPID IN 
(SELECT TB1.GROUPID FROM MYTABLE TB1 JOIN MYTABLE TB2 ON TB1.GROUPID = TB2.GROUPID 
AND TB1.PRICE = 0 AND TB2.PRICE = 0) 
and CUSTOMER = 4 
ORDER BY GROUPID; 

이 쿼리 반환 : 내 경우

| Groupid | Price | Customer| 
-------------------------------- 
| 001  | 9  | 4  | 
| 001  | 0  | 4  | 
| 003  | 0  | 4  | 
| 003  | 0  | 4  | 
-------------------------------- 

, 난 단지 내가 필요 GROUPID 003을 반환하는 t.

또한 groupid 내의 모든 0 이외의 PRICE 값을 반환하도록 쿼리를 수정하는 데 도움을 요청하고 싶습니다. 위와 동일한 쿼리를 수행 할 필요는 없습니다. 예를 들어 반환 값은 다음과 같습니다.

| Groupid | Price | Customer| 
-------------------------------- 
| 002  | 4  | 4  | 
| 002  | 4  | 4  | 

아무 도움이됩니다. 시간 내 주셔서 감사합니다. 모든 가격은 제로 경우

+0

하면이'null이 될 price' 수 있습니까? – mathguy

+0

조인은 이런 종류의 질문에 대한 답변 유형이 매우 드물습니다. GROUP BY 및 HAVING 절이보다 효율적으로 접근합니다 (Gordon은이 줄을 따라 답변을 게시했습니다.) – mathguy

답변

3

, 다음 그룹 ID의 최소 및 최대 가격을보고 :

select groupid 
from mytable t 
group by groupid 
having min(price) = 0 and max(price) = 0; 

나는 더 자체 조인이 필요하지 않습니다 지적한다.

+0

언제나처럼 위대한 답변입니다. 제발. 큰 테이블에서 어느 것이 더 빠를 것입니까? 집계 또는 자체 조인 또는 상관 쿼리? – GurV

+0

@ GurwinderSingh - 모든 크기 테이블에서 집계가 조인보다 빠릅니다. 상관 관계가있는 하위 쿼리는 많은 경우에 조인보다 속도가 느릴 것입니다 (옵티마이 저가 단순한 경우에도 마찬가지입니다 -이 경우처럼 상관 관계가있는 하위 쿼리를 조인으로 변환합니다). – mathguy

+0

@mathguy 감사합니다. 나는이 대답의 결과가 groupid 만 제공하지만 OP는 모든 칼럼을 요구했음을 지적해야한다. 따라서 * IN * 절 또는 상관 쿼리가 여전히 필요합니다. – GurV

0

이 시도 :

SELECT * FROM MYTABLE as m1 where Price = 0 
and not exists (
    select 1 
    from MYTABLE as m2 
    where m2.Groupid = m1.Groupid 
    and m2.Price <> 0 
    ) 
0

당신은 누구의 GROUP_ID이 아닌 가격이 0에 행이 없습니다의 행을 표시 할 수 있습니다

select groupid, price, customer from mytable t 
where not exists (
    select 1 from mytable where group_id = t.group_id 
    and price != 0 
); 
0

편집 고든의 첫 번째에 가장 적합한 솔루션입니다 부분 :

SELECT groupid 
FROM mytable t 
GROUP BY GroupID 
HAVING (MAX(price) = 0 and MIN(price) = 0) 

두 번째 부분 : 하나

SELECT groupid 
FROM mytable t 
GROUP BY GroupID 
HAVING MIN(price) <> 0 AND (MAX(price) = MIN(price)) 

내 원래 :이 가정

SELECT groupid 
FROM mytable t 
GROUP BY GroupID 
HAVING SUM(Price) =0 

, 부정적인 가격이 존재하지 않는다.

SELECT groupid 
FROM mytable t 
WHERE Price > 0 
GROUP BY GroupID, Price 
HAVING COUNT(price) > 1 
-1

내가 매우 유사 고든

SELECT groupId 
FROM MyTable 
GROUP BY groupId 
HAVING SUM(price) = 0 
0

을 게시 무엇을 할 것 I는 각 그룹을 통해 서로 다른 가격의 수를 세 어서 그것을 할 것이다 : 당신의 질문의 두 번째 부분으로

(그리고 나는 각 그룹이 같은 고객을 가질 것이라고 가정한다) 관심있는 가격을 필터링한다.

예를 들어, 각 그룹 ID + 고객의 모든 행 0입니다 가격 : 당신이 모든 행에 대해 동일한 비 제로 가격을 가지고 그룹을 원하는 경우

WITH mytable AS (SELECT '001' groupid, 9 price, 4 customer FROM dual UNION ALL 
       SELECT '001' groupid, 0 price, 4 customer FROM dual UNION ALL 
       SELECT '002' groupid, 4 price, 4 customer FROM dual UNION ALL 
       SELECT '002' groupid, 4 price, 4 customer FROM dual UNION ALL 
       SELECT '003' groupid, 0 price, 4 customer FROM dual UNION ALL 
       SELECT '003' groupid, 0 price, 4 customer FROM dual UNION ALL 
       SELECT '004' groupid, 4 price, 4 customer FROM dual UNION ALL 
       SELECT '004' groupid, 7 price, 4 customer FROM dual) 
SELECT groupid, 
     customer, 
     price 
FROM (SELECT groupid, 
       customer, 
       price, 
       COUNT(DISTINCT price) OVER (PARTITION BY groupid, customer) num_distinct_prices 
     FROM mytable) 
WHERE num_distinct_prices = 1 
AND price = 0; 

GROUPID CUSTOMER  PRICE 
------- ---------- ---------- 
003    4   0 
003    4   0 

그냥 and price != 0and price = 0 변경 . 또는 단순히 해당 술어를 모두 제거하십시오.

0

샘플 데이터에는 한 명의 고객 만 있습니다. 두 명 이상의 고객이있는 경우 groupid가 동일한 가격 인 행을 모든 행 및 모든 고객에 반환하려는 경우를 가정합니다. 그렇다면 아래 쿼리를 사용할 수 있습니다. 그것은 Boneist와 거의 같습니다. 저는 count (distinct) 대신 min (price)와 max (price)를 사용합니다. partition bycustomer을 포함시키지 않았습니다.

가격이 NULL 일 수있는 경우 최대 가격 및 최소 가격 계산시 무시됩니다. groupid에 대해 NON-NULL 가격이 모두 같으면 해당 그룹의 모든 행이 반환됩니다. price가 NULL이 될 수 있고 이것이 원하는 동작이 아니라면 쉽게 변경할 수 있습니다. 그러나 OP가 명확해야합니다.

아래 쿼리는 groupid에 대해 단일 가격이있는 모든 경우를 검색합니다. 가격이 0 인 그룹 만 검색하려면 (추가 조건) 외부 쿼리의 WHERE 절에 and price = 0을 추가하십시오. 쿼리에서 다루는 몇 가지 사례를 보여주기 위해 더 많은 테스트 데이터를 추가했습니다.

with 
    test_data (groupid, price, customer) as (
     select '001', 9, 4 from dual union all 
     select '001', 0, 4 from dual union all 
     select '002', 4, 4 from dual union all 
     select '002', 4, 4 from dual union all  
     select '003', 0, 4 from dual union all 
     select '003', 0, 4 from dual union all 
     select '004', 4, 4 from dual union all  
     select '004', 7, 4 from dual union all 
     select '002', 4, 8 from dual union all 
     select '005', 2, 8 from dual union all 
     select '005', null, 8 from dual 
    ), 
    prep (groupid, price, customer, min_price, max_price) as (
     select groupid, price, customer, 
       min(price) over (partition by groupid), 
       max(price) over (partition by groupid) 
     from test_data 
    ) 
select groupid, price, customer 
from prep 
where min_price = max_price 
; 


GROUPID  PRICE CUSTOMER 
------- --------- --------- 
002    4   8 
002    4   4 
002    4   4 
003    0   4 
003    0   4 
005      8 
005    2   8 
0

이 당신이 원하는 것을 할 수있다 :

SELECT * FROM MYTABLE 
WHERE GROUPID NOT IN (
     SELECT GROUPID 
     FROM MYTABLE 
     WHERE Price <> 0) 

을 그냥 다른 쿼리의 마지막 줄에 변경 :

SELECT * FROM MYTABLE 
WHERE GROUPID NOT IN (
     SELECT GROUPID 
     FROM MYTABLE 
     WHERE Price = 0) 
관련 문제