2016-12-07 1 views
0

다음 쿼리를 참조로 사용하여 지난 한 주 동안 쿼리를 만들려고했는데 몇 가지 도움이 필요하므로 각 섹션의 기능을 알고 있습니다.SQL 쿼리 이해에 대한 지침

Select Distinct 
     tblCustomers.fldEmail 
     , tblCustomers.fldCustomerID 
     , tblCustomers.fldName 
     , tblCustomers.fldContactName 
From tblBigClubs 
Inner Join tblBigClubMatch 
     On tblBigClubs.fldBigClubID = tblBigClubMatch.fldBigClubID 
Inner Join tblCustomers 
     On tblBigClubMatch.fldCustomerID = tblCustomers.fldCustomerID 
Where (tblBigClubs.fldBigClubID In (Select Distinct 
               dbo.tblBigClubMatch.fldBigClubID 
             From  dbo.tblOrders 
             Inner Join dbo.tblOrderItems 
               On dbo.tblOrders.fldOrderID = dbo.tblOrderItems.fldOrderID 
             Inner Join dbo.tblBigClubMatch 
               On dbo.tblOrders.fldCustomerID = dbo.tblBigClubMatch.fldCustomerID 
             Where  (dbo.tblOrders.fldOrderDate > DateAdd(Year, -2, GetDate())) 
               And (dbo.tblOrderItems.fldStockCode Like 'TO%') 
             Group By dbo.tblBigClubMatch.fldBigClubID 
             Having (Sum(dbo.tblOrderItems.fldQtyOrder) >= 30)) 
     And tblCustomers.fldEmail Is Not Null 
     And dbo.tblCustomers.fldEmail <> '' 
     And Len(dbo.tblCustomers.fldEmail) > 8 
     ); 

누군가 각 섹션의 기능을 설명해 주실 수 있습니까?

+0

시작, 쿼리 –

+2

오이를 이해할 수 있습니다 별칭 이름을 사용하여 해당 헝가리어 표기법 (https://en.wikipedia.org/wiki/ :

그래서 실제로,이 또한 동등해야한다 Hungarian_notation)이 내 눈을 죽이고있다. – Yuck

+0

이것은 내 SQL 쿼리가 아니며, 이해하는 데 도움이 필요합니다. @Prdp –

답변

1

우선 단순화 및 형식 :

Select Distinct c.fldEmail, c.fldCustomerID, c.fldName, c.fldContactName 
From tblBigClubs b 
    Join tblBigClubMatch m On m.fldBigClubID = b.fldBigClubID 
    Join tblCustomers c On c.fldCustomerID = m.fldCustomerID 
Where Len(c.fldEmail) > 8 
    and b.fldBigClubID In 
     (Select Distinct im.fldBigClubID 
     From dbo.tblOrders o 
      Join dbo.tblOrderItems i On i.fldOrderID = o.fldOrderID 
      Join dbo.tblBigClubMatch im On im.fldCustomerID = o.fldCustomerID 
     Where o.fldOrderDate > DateAdd(Year, -2, GetDate()) 
      And i.fldStockCode Like 'TO%' 
     Group By im.fldBigClubID 
     Having Sum(i.fldQtyOrder) >= 30); 

를 상기 기능적 동등하다. 별칭을 사용하면 많은 혼란을 피할 수 있고 SQL을 쉽게 읽고 이해할 수 있습니다. 그런 다음 술어를 검사하십시오. 이 만족되면, 분명히, fldEmail가 null이 될 수 없으며,

b.fldBigClubID In subquery 절 -

Len(c.fldEmail) > 8 :이 두 있습니다. 이것은 fldBigClubID의 모든 값을 찾은 것 같습니다. 여기에서 은 TO으로 시작하고 fldOrderDate은 지난 2 년 동안 같은 기간에 30 개 이상의 주문을 받았습니다.

요약하면 지난 2 년 동안 TO으로 시작하는 주식 코드가있는 상품에 대해 30 개 이상의 주문을 가진 고객의 고객 표에서 4 개의 입력란이 표시됩니다.

Select fldEmail, fldCustomerID, 
    fldName, fldContactName 
From tblCustomers 
Where fldCustomerID In 
    (Select distinct o.fldCustomerID 
     From dbo.tblOrders o 
     Join dbo.tblOrderItems i On i.fldOrderID = o.fldOrderID 
     Join dbo.tblBigClubMatch m On m.fldCustomerID = o.fldCustomerID 
    Where o.fldOrderDate > DateAdd(Year, -2, GetDate()) 
     And i.fldStockCode Like 'TO%' 
    Group By m.fldBigClubID 
    Having Sum(i.fldQtyOrder) >= 30); 
0

전체 쿼리를 수행 할 가능성은 없지만 특정 부분에 문제가있는 경우 도움을 드릴 수 있습니다. 귀하의 의견에 회신

DateAdd(Year, -2, GetDate()) 

이 날짜는 2 년에서 오늘 날짜까지를 반환합니다. 당신은 그들이 최근 2 년에서 30 개 항목 이상을 주문한 고객을 당기는 같은 보이는

SELECT DateAdd(Year, -2, GetDate()) 

반환

2014-12-07 10:56:07.290 

를 실행할 수 있습니다. 모든

+0

도움을 주셔서 감사합니다.이 의미가 있습니다. 설명해 주시겠습니까? "어디에서 (tblBigClubs.fldBigClubID IN (선택 표시) ..." –

+0

@MattEllis 그들은 지난 2 년 동안 30 개 이상의 아이템을 주문한 클럽에서 모든 BigClub을 얻으 려하지만 – SQLChao

+0

괜찮습니다. 아래의 대답은 이해하기가 더 쉬워졌습니다. –