2013-12-19 3 views
0

계정 상태가 COLLECTIONS 인 고객의 보고서를 생성해야하며 DECLINED가 1 회 이상 연속 청구되었습니다.계정 상태에 따라 고객 선택

Customer Table 
===================== 
CustomerID 
FirstName 
LastName 
Email 
Status (Collections) 

Charge 
===================== 
ChargeID 
CustomerID 
DateCharged 
Amount 
ACK (Declined) 

SELECT Customer.CustomerID, Customer.FirstName, Customer.LastName, 
     Customer.Status, Charge.ChargeID, Charge.Amount, Charge.DateCharged, Charge.ACK 
FROM  Customers 
INNER JOIN Charge 
ON Customer.CustomerID=Charge.CustomerID 
AND Charge.ACK = 'Declined' 

고객은 컬렉션에 보내기 전에 최소 2 개의 DECLINED 요금이 발생해야합니다. 고객이 2 회 하락했는지 확인하려면 어떻게해야합니까?

+0

,'GROUP BY','HAVING', 그리고'COUNT' –

+0

단지 방향,하지만 일반적으로 처리하는 방법이 분할 행 열을 추가 그대로 대답이 점을 넣어하지 않음 고객이 (행 번호를 사용하고 키워드별로 파티션을 사용). 그런 다음 고객의 행 번호와 행 번호 -1에 따라 자체 조인을 수행합니다. ACK가 거부되면 승자가 생깁니다. – UnhandledExcepSean

답변

0

보통 일반적으로 having 절을 사용하여 집계를 수행합니다.

그러나 쿼리에서 거부에 대한 세부 정보도 필요하다고 제안합니다. 대신, 윈도우 함수를 사용하여 감소의 총 수를 계산하기 위해 : 당신은 단지 고객이 아니라에게 세부 사항을 원하는 경우

SELECT * 
FROM (SELECT c.CustomerID, c.FirstName, c.LastName, 
      c.Status, ch.ChargeID, ch.Amount, ch.DateCharged, ch.ACK, 
      sum(case when ch.ACK = 'Declined' then 1 else 0 end) over 
       (partition by c.customerId) as NumDeclines 
     FROM Customers c INNER JOIN 
      Charge ch 
      ON c.CustomerID = ch.CustomerID 
    ) cc 
WHERE ACK = 'Declined' and NumDeclines >= 2 
ORDER BY CustomerId, DateCharged; 

을, 다음을 수행하십시오

내 댓글 당
SELECT c.CustomerID, c.FirstName, c.LastName, c.Status 
FROM Customers c INNER JOIN 
    Charge ch 
    ON c.CustomerID = ch.CustomerID 
WHERE ACK = 'Declined' 
GROUP BY c.CustomerID, c.FirstName, c.LastName, c.Statu 
HAVING count(*) >= 2; 
+0

귀하의 솔루션이 일관성이 거부되었다고 생각됩니다. – UnhandledExcepSean

+0

@SpectralGhost. . . 문제는 모호합니다. 그것은 한 곳에서 "연속적"이라고 말하면서 "고객이 컬렉션에 보내기 전에 최소 2 개의 거부 된 청구액을 가져야합니다"라고 말합니다. 영업 인은 그 의도를 분명히 분명히해야합니다. –

+0

2 회 연속 감소가 필요하다는 의미로 사용했습니다. – UnhandledExcepSean

0

,이 방법입니다 I 당면 과제를 수행 할 것입니다.

SELECT 
* 
FROM (
    SELECT 
      Row_Number() OVER (PARTITION BY Customer.CustomerID ORDER BY Charge.DateCharged DESC) AS [Row], 
      Customer.CustomerID, Customer.FirstName, Customer.LastName, 
      Customer.Status, Charge.ChargeID, Charge.Amount, Charge.DateCharged, Charge.ACK 
    FROM  Customers 
    INNER JOIN Charge ON Customer.CustomerID=Charge.CustomerID 
) a 
INNER JOIN (
    SELECT 
      Row_Number() OVER (PARTITION BY Customer.CustomerID ORDER BY Charge.DateCharged DESC) AS [Row], 
      Customer.CustomerID, Customer.FirstName, Customer.LastName, 
      Customer.Status, Charge.ChargeID, Charge.Amount, Charge.DateCharged, Charge.ACK 
    FROM  Customers 
    INNER JOIN Charge ON Customer.CustomerID=Charge.CustomerID 
) b ON a.CustomerID=b.CustomerID 
WHERE a.[Row]=b.[Row]-1 
AND a.ACK = 'Declined' 
AND b.ACK = 'Declined' 
AND a.[Row] IN (1,2) 
AND b.[Row] IN (1,2) 
당신이 필요합니다
+0

시도했지만 오류가 발생했습니다 : \t 잘못된 열 이름 'a' – Unohoo

+0

다시 시도하십시오. 복사 오류 붙여 넣기 – UnhandledExcepSean

+0

그것은 실제로 사용자 오류 (웃음)이었습니다. 죄송합니다. 문제가 명확하지 않으면. 귀하의 질의는 2 회 이상 거부 된 모든 계정을 반환합니다. 계정에서 마지막 2 개의 거부 만하면됩니다. 고객이 7 회 하락한 경우 마지막 2 회를 ​​반환해야합니다. – Unohoo

관련 문제