2017-09-18 1 views
0

현재 SQL 클래스에 대한 할당 작업을하고 있는데 막혔습니다. 질문에 답하기위한 전체 코드를 찾지 않고 올바른 방향으로 조금 움직여보고 싶습니다. 당신은 당신이 그런 식으로 한 이유에 작은 설명이 될까요 전체 코드를 제공 할 경우 (그래서 실제로 뭔가를 배울 수 있습니다.) 여기 SQL Server 2016 하위 쿼리 지침

는 질문 :

SELECT 문을 작성하는 것이 반환 세 열 : EmailAddress, ShipmentId 및 각 클라이언트의 주문 총계. 이렇게하려면 결과 집합을 EmailAddressShipmentId 열별로 그룹화 할 수 있습니다. 또한 ShipItems 테이블의 열에서 주문 합계를 계산해야합니다.

FROM 절에서 첫 번째 SELECT 문을 사용하는 두 번째 SELECT 문을 작성하십시오. 기본 쿼리는 두 개의 열, 즉 클라이언트의 전자 메일 주소와 해당 클라이언트의 가장 큰 순서를 반환해야합니다. 이렇게하려면 EmailAddress 열로 결과 집합을 그룹화 할 수 있습니다.

은 내가 사용하지 않는 다른 테이블에 데려 와야을 가입하기 위해 같이 Clients 테이블에서 EmailAddress 열에서 당겨하는 방법에 대한 혼란 스러워요. 하위 쿼리를 사용하여이 작업을 수행하는 쉬운 방법이 있다고 가정합니다. 그 시간에 우리가 작업하고있는 것입니다.

감사합니다.

+1

"하위 쿼리"와 "상관 하위 쿼리"의 차이점이 있습니다. 모든 하위 쿼리가 상관 관계가있는 하위 쿼리라고 생각하는 초보자도있을 수 있습니다. 이것이 귀하의 질문에 적용되지는 않습니다. – Dai

+0

사용중인 테이블의 정의를 제공해주십시오. 지금까지'Clients (EmailAddress)','Shipments (ShipmentId)'및'ShipItems (ShipmentId)'가 3 개의 테이블과 컬럼인지 확인할 수 있습니다. 주문 총계는 어디에 정의되어 있습니까? 'Shipments'에 저장되어 있거나'ShipItems'에서 계산해야합니까? – Dai

+0

당신은 "EmailAddress' [...]를 쓰기 위해 그것을 쓴다. 나는 사용되지 않는 다른 테이블을 가져와야 만한다." - 당신은 다른 테이블이 무엇인지, 왜 그들이 "사용되지 않고있다"고 생각하는지에 대해 말하지 않았다. 내가 볼 수있는 한, 그들은 * 사용되고 있습니다. – Dai

답변

1

SQL을 단순 테이블이 아닌 데이터 세트로 작업하는 것으로 생각하십시오. 테이블은 단지 데이터 세트 일뿐입니다. 이제

SELECT * FROM MyTable1 

당신이 첫 번째 두 개의 열을 얻을 수 있다면, :이 방법으로 데이터를 볼 때 쿼리가 아래 표되고, 다른 세트의 전체 구성 데이터 세트를 반환 그래서 당신은 즉시 참조

SELECT col1, col2 FROM MyTable1 

지금이 두 번째 세트,뿐만 아니라 "테이블"등의 데이터의 하위 집합을 치료하고이처럼 조회 할 수 있습니다 : MyTable1에서 만 열 1, 2로 구성되어 다른 세트를 반환

SELECT 
    * 
FROM (
    SELECT 
     col1, 
     col2 
    FROM 
     MyTable1 
) 

그러면 내부 집합에 제공된 두 열의 모든 열이 반환됩니다.

당신이 학생 인 것처럼 보이고 내게 전체 답을 줄 수없는 내적 쿼리는 그룹으로 구성된 쿼리가 될 것입니다 BY 절과 주문 값 필드의 합계. 그러나 당신이 이해할 필요가있는 핵심 사항은이 생각을 설정하는 것입니다 : 괄호 안에 전체 쿼리를 래핑하고 위에서 한 것처럼 테이블로 처리 할 수 ​​있습니다. 잘하면이 도움이됩니다.

select emailaddress, max(OrderTotal) as MaxOrder 
from 
(-- Open the subquery 
select Cl.emailaddress, 
     Sh.ShipmentID, 
     sum(SI.Value) as OrderTotal -- Use the line item value column in here 
from Client Cl -- First table 
inner join Shipments Sh -- Join the shipments 
    on Sh.ClientID = Cl.ClientID 
inner join ShipItem SI -- Now the items 
    on SI.ShipmentID = Sh.ShipmentID 
group by C1.emailaddress, Sh.ShipmentID -- here's your grouping for the sum() aggregation 
) -- Close subquery 
group by emailaddress -- group for the max() 
0

는이 같은 하위 쿼리가 필요합니다.
ShipItems 테이블로의 발송물 (ShipmentId에 있음).
그런 다음 결과를 그룹화하고 필요한 총계를 계산하거나 합계하십시오.

동일한 열 이름을 가진 조인 된 테이블에서 필드를 선택할 때 테이블에 별칭을 사용하는 것이 유용합니다.하위 쿼리에 그룹화 된 쿼리를 사용 는

select 
c.EmailAddress, 
i.ShipmentId, 
SUM((i.ShipItemPrice - i.ShipItemDiscountAmount) * i.Quantity) as TotalPriceDiscounted 
from ShipItems i 
join Shipments s on (s.ShipmentId = i.ShipmentId) 
left join Clients c on (c.ClientId = s.ClientId) 
group by i.ShipmentId, c.EmailAddress 
order by i.ShipmentId, c.EmailAddress; 

, 당신은 EmailAddress를 당 최대 총을 얻을 수 있습니다.

select EmailAddress, 
-- max(TotalShipItems) as MaxTotalShipItems, 
max(TotalPriceDiscounted) as MaxTotalPriceDiscounted 
from (
    select 
    c.EmailAddress, 
    -- i.ShipmentId, 
    -- count(*) as TotalShipItems, 
    SUM((i.ShipItemPrice - i.ShipItemDiscountAmount) * i.Quantity) as TotalPriceDiscounted 
    from ShipItems i 
    join Shipments s on (s.ShipmentId = i.ShipmentId) 
    left join Clients c on (c.ClientId = s.ClientId) 
    group by i.ShipmentId, c.EmailAddress 
) q 
group by EmailAddress 
order by EmailAddress 

TOP을 사용하지 않으면 ORDER BY는 서브 쿼리 내에서 거의 의미가 없습니다.

0

첫 번째 쿼리는 (클라이언트 ID에) 선적에 클라이언트를 가입 할 수 있습니다 경우 :

+0

좋아, 그래서 나는 터치를 더해야한다고 생각한다. ShipItems 테이블은 Clients 테이블과 PK 또는 FK를 공유하지 않습니다. flients 테이블과 PK 또는 FK를 공유하는 유일한 테이블은 Shipments 테이블입니다. 이것이 바로 원래 Shipments 테이블을 가져 오지 않고이 작업을 수행하는 방법을 알지 못했기 때문입니다. 그러나이를 사용하는 유일한 방법은 Clients 및 ShipItems 테이블에 가입하는 것입니다. –

+0

다시 귀하의 게시물을 읽고, 나는 그것을 알아 냈다고 생각합니다. 고마워, 추가 도움이 필요하면 다시 게시 할 것입니다. –

+0

@BrettHawkins 두 번째 쿼리가 이제 배송 테이블을 포함하도록 변경했습니다. 나는 원래의 질문에서 그러한 테이블이 간과되었다고 생각했다. – LukStorms