2012-03-22 2 views
0

내 결과를 ID로 그룹화하려고 시도했지만 오류가 발생합니다 : " 'Customers.CompanyName'열이 선택 목록에서 유효하지 않습니다. 집계 함수 나 GROUP BY 절에 포함되지 않습니다. " 무슨 내 수정 여기반복 ID로 SQL GROUP 던짐 - (집계 함수에 포함되어 있지 않음)

DECLARE @dateCompare datetime2 = '2011-01-01 00:00:00.0000000'; 
DECLARE @dateLow datetime2 = '1992-04-01 00:00:00.0000000'; 
DECLARE @dateHigh datetime2 = '1993-06-01 00:00:00.0000000'; 
SELECT o.OrderID, c.CompanyName, o.ShippedDate, DATEDIFF(year, o.OrderDate, @dateCompare) AS 'ElapsedYear' 
FROM Orders o , Customers c 
WHERE o.ShippedDate >= @dateLow AND o.ShippedDate <= @dateHigh 
GROUP BY o.OrderID 

: 여기

내 문입니까? 내가 뭘 놓치고 있니?

+2

'GROUP BY'를 사용하면 어떤 효과가 있습니까? 다른 열의 다양한 값에 어떤 영향이있을 것으로 예상하십니까? –

+0

'Orders'와 'Customers'가 서로 어떻게 관련되어 있는지 (조인 조건)를 나타내는 조건이 누락되었을 가능성이 높습니다. –

답변

1

집계와 다른 여러 열이있는 경우 group by 절에 다른 열을 포함해야합니다. 다음에 약간 수정 : 당신이하지 않은 경우

SELECT o.OrderID, c.CompanyName, o.ShippedDate, DATEDIFF(year, o.OrderDate, @dateCompare) AS 'ElapsedYear' 
FROM Orders o , Customers c 
WHERE o.ShippedDate >= @dateLow AND o.ShippedDate <= @dateHigh 
GROUP BY o.OrderID, c.companyName, o.ShippedDate 
+3

OPs 쿼리 (및 위)에 * 모든 * 집계 ('DATEDIFF'는 하나가 아닙니다)가 포함되어 있지 않으므로 실제로 달성하고자하는 것이 확실하지 않습니다. –

1

에만 등

2

MAX (colName 사용), AVG (colName 사용)와 같은 조항에 의해 그룹의 일부 열 및 집계 열을 선택할 수 있습니다 결과를 요약하기 위해 group by 절이 필요하지 않습니다.

여기에서 주문 ID별로 그룹화합니다. 그러나 group by 절 포함 여부에 관계없이 주문 당 하나의 행 (지정된 날짜 기준 내)을 반환하는 것처럼 보입니다.

따라서 group by 절을 제거하십시오.

편집 : AndriyM의 의견에서 언급했듯이이 쿼리에는 현재 두 테이블 사이에 조인 조건이 없습니다. 즉, 한 테이블의 모든 레코드가 다른 테이블의 모든 레코드에 연결되는 데카르트 조인을 효율적으로 만듭니다.) WHERE 절에 조인 조건을 추가하거나 (또는 ​​명시 적으로 두 테이블을 결합하는 것) 확실히 가치가 있습니다.

+1

내 생각 엔 GROUP BY가 조인 조건 부재로 인한 중복을 수정하려고 한 것 같습니다. –

+0

@ 안드리 : 잘 찾아 냈습니다. –

+0

이것은 그 것이다. 모두에게 감사드립니다! – gcookie

관련 문제