2014-11-13 2 views
0

이 테이블의 엔티티에서 52 주 분량의 데이터를 합산 한 쿼리를 작성하려고합니다. Summing Subquery

enter image description here

나는 다음과 같은 쿼리를 사용하여 CYSales에 대한 과거 52주을 얻는 방법을 알아 냈어. 결과 보고서에서 일년과 한주가 매개 변수가 될 것이므로 그 값은 임의적입니다. 이 예제에서는 현재 연도와 주 40을 사용했습니다. 나에게주는

SELECT [Group],[Owner],[SalesPersonNumber],SUM([tot_sls_amt]) AS CYSales 
    FROM TableA 
    WHERE ((Year = year(getdate()) AND Week <= 40) OR (Year = year(getdate()) - 1 AND Week > 40)) AND cmp_status = 'A' 
    Group BY [Group] 
     ,[Owner] 
     ,[SalesPersonNumber] 

enter image description here

지금은 다른 계산 된 열에서 PYSales 금액을 얻으려고 노력하지만,있어 내가 오류를 얻을에 내 하위 쿼리를 추가 할 때

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

PYSales를 제공하기 위해 다음 쿼리를 어떻게 수정합니까?

SELECT [Group] 
     ,[Owner] 
     ,[SalesPersonNumber] 
     ,SUM([tot_sls_amt]) AS CYSales 
     ,(SELECT SUM([tot_sls_amt]) 
      FROM TableA 
      WHERE ((Year = year(getdate())-1 AND Week <= 40) OR (Year = year(getdate()) - 2 AND Week > 40)) AND cmp_status = 'A' 
      Group BY [Group] ,[Owner],[SalesPersonNumber]) AS PYSales 
    FROM TableA 
    WHERE ((Year = year(getdate()) AND Week <= 40) OR (Year = year(getdate()) - 1 AND Week > 40)) AND cmp_status = 'A' 
    Group BY [Group] 
      ,[Owner] 
      ,[SalesPersonNumber] 

답변

1

내가 당신의 하위 쿼리를 이동하여 가입하거나 CTE를 사용하는 것이 적용 사용, 주어진 주 및 연도의 모든 값 전체의 총이 필요합니다. 내가 왼쪽을 사용

당신이 늘

을 didnt가 데이터를 테스트해야 평 데이터를 가지고 새로운 사람을 넣다 가입, 뭔가가 실패 할 경우 알려 주시면 수정할 수 있습니다.

SELECT 

a.[Group] 
,a.[Owner] 
,a.[SalesPersonNumber] 
,SUM(a.[tot_sls_amt]) AS CYSales 
,(b.[tot_sls_amt]) AS PYSales 

    FROM 

TableA a 
     Left Join 
      (SELECT sum([tot_sls_amt]) tot_sls_amt,[Group],[Owner] ,[SalesPersonNumber] 
       FROM TableA 
        WHERE ((Year = year(getdate())-1 AND Week <= 40) OR (Year = year(getdate()) - 2 AND Week > 40)) AND cmp_status = 'A' 
         group by [Group],[Owner] ,[SalesPersonNumber]) b on a.group = b.group and a.owner = b.owner and a.salespersonumber =b.salespersonnumber 



WHERE 
((Year = year(getdate()) AND Week <= 40) OR (Year = year(getdate()) - 1 AND Week > 40)) AND cmp_status = 'A' 


Group BY 
a.[Group] 
,a.[Owner] 
,a.[SalesPersonNumber] 
,(b.[tot_sls_amt]) 
+0

메시지 : 메시지 8155, 수준 16, 상태 2, 줄 16 'b'의 열 1에 대해 열 이름이 지정되지 않았습니다. msg 207, 수준 16, 상태 1, 줄 28 'tot_sls_amt'열 이름이 잘못되었습니다. msg 207, 수준 16, 상태 1, 줄 7 'tot_sls_amt'열 이름이 잘못되었습니다. – d90

+0

@NicholasJDininno fixed - 조인 하위 쿼리의 열 이름을 잊어 버렸습니다. – lookslikeanevo

0

당신이 당신의 외부 쿼리와 동일 그룹, 소유자, SalesPersonNumber, 각 쌍의 합계를 반환합니다 하위 쿼리에 GROUP BY을 다하고 있습니다.

는 경우에 당신은 단지 합을하고 교차

SELECT [Group] 
     ,[Owner] 
     ,[SalesPersonNumber] 
     ,SUM([tot_sls_amt]) AS CYSales, 
     T.total AS PYSales 
    FROM TableA 
    WHERE ((Year = year(getdate()) AND Week <= 40) OR (Year = year(getdate()) - 1 AND Week > 40)) AND cmp_status = 'A' 
    Group BY [Group] 
      ,[Owner] 
      ,[SalesPersonNumber] 
    CROSS APPLY (
      SELECT SUM([tot_sls_amt]) as total 
      FROM TableA 
      WHERE ((Year = year(getdate())-1 AND Week <= 40) OR (Year = year(getdate()) - 2 AND Week > 40)) AND cmp_status = 'A' 
     ) As T 
+0

그룹별로 걸릴 경우 모든 PYSales에 대해 동일한 금액을받습니다. 그룹, 소유자 및 영업 사원 번호별로 그룹화해야합니다. 귀하의 답변을 사용하여, 나는 : 'CROSS'키워드 근처에 구문이 잘못되었습니다. 'As'키워드 근처의 구문이 잘못되었습니다. – d90