2014-03-26 2 views
0

저는 SQL에 매우 익숙하며 "SAMS Teach Yourself SQL in 24 hours"이라는 책에서이 책을 읽었습니다. 내 관심사는 선택 출력을 조인하고 그룹화하는 것입니다. 내가 실현하려하고 싶은 무엇MS SQL - 그룹 가입

CREATE TABLE ORDERS_TBL 
(ORD_NUM VARCHAR(10) NOT NULL primary key, 
    CUST_ID VARCHAR(10) NOT NULL, 
    PROD_ID VARCHAR(10) NOT NULL, 
    QTY INTEGER NOT NULL, 
    ORD_DATE DATE); 

CREATE TABLE PRODUCTS_TBL 
(PROD_ID VARCHAR(10) NOT NULL primary key, 
    PROD_DESC VARCHAR(40) NOT NULL, 
    COST DECIMAL(6,2) NOT NULL); 

내 PROD_ID에 의해 그룹 것 조인 작업은 다음과 같습니다 여기 내 테이블의 구조입니다.

SELECT P.PROD_DESC, SUM(O.QTY) 
    FROM PRODUCTS_TBL AS P LEFT JOIN ORDERS_TBL AS O 
    ON P.PROD_ID = O.PROD_ID 
    GROUP BY P.PROD_ID 
    ORDER BY P.PROD_ID; 

위의 쿼리는 MySQL에서는 작동하지만 MS SQL 환경에서는 작동하지 않습니다. 내 출력에서 ​​PROD_ID를보고 싶지 않기 때문에 효과가 있지만 성가시다.

SELECT P.PROD_ID, P.PROD_DESC, SUM(O.QTY) 
    FROM PROCUCTS_TBL AS P LEFT JOIN ORDERS_TBL AS O 
    ON P.PROD_ID = O.PROD_ID 
    GROUP BY P.PROD_ID, P.PROD_DESC 
    ORDER BY P.PROD_ID; 

내가 PROD_DESC, PROD_ID에 의한 수량 및 그룹의 합계로 출력 테이블을하는 방법에 대한 어떤 힌트?

+1

를 원하는 경우, 나는 사람들이 대문자를 가지고 있다는 것을 결코 이해하지 못했다. 그것은 코드가 눈을 부 풀리는 것처럼 느낍니다. 나는 1957 년 Fortran을 요구했지만 2014 년에 그것을 요구 했습니까? – Blindy

+0

은 저를 위해 일했습니다. 미안하지만 노력했지만, 당신이하고 싶은 것에는 아무런 문제가 없었습니다. 더하기 당신은 우리에게 컴파일 오류를주지 않았습니다. –

+0

테이블에 작은 글자를 사용하고 있지만이 예제는 모든 CAPS와 함께 사용할 준비가되었습니다. 당신이 옳습니다, 여기서 읽기가 약간 어렵습니다. – RobaL

답변

5

TSQL에서 당신이 GROUP BY 절에 포함되지 않은 열을 선택할 수 없습니다 (이해하지 왜 당신이 그것을 감지 이럴하지 않기 때문에 할 수있는 MySQL의에서)

더러운 트릭을 min() 또는 max() 또는 이와 유사한 기능 (필요에 따라)으로 선택하는 것은 집계되지 않은 열 행 중 하나만 선택하는 것입니다.

SELECT max(P.PROD_DESC), SUM(O.QTY) 
FROM PRODUCTS_TBL AS P LEFT JOIN ORDERS_TBL AS O 
    ON P.PROD_ID = O.PROD_ID 
GROUP BY P.PROD_ID 
ORDER BY P.PROD_ID; 

어쨌든 P.PROD_DESC 열이는 Group by 절에 포함하는 것이 좋습니다 또는 동일한 경우 모든 다른 P.PROD_ID, P.PROD_DESC 행

+0

+1, 이것은 내가 보통 (나는 '분'을 좋아하지만)하는 방법이다. – Blindy

+0

@ 블라인디 :) 나는 최대 : DD를 좋아한다. – giammin

1

SQL의 대부분의 풍미에서 집계하지 않고 선택한 열은 group by 절에 나타나야합니다. 당신이 나타나지 않는 열을 기준으로 그룹을 수, 각 PROD_ID에 대한 고유하지 않습니다

SELECT P.PROD_DESC, SUM(O.QTY) 
    FROM PRODUCTS_TBL AS P LEFT JOIN ORDERS_TBL AS O 
    ON P.PROD_ID = O.PROD_ID 
    GROUP BY P.PROD_DESC 
    ORDER BY P.PROD_ID; 

PROD_DESC 경우

PROD_DESC 경우 PROD_DESC에 의해 그럼 그냥 그룹, 각 PROD_ID에 고유 당신은 잘 될 것입니다 문제 없습니다. 이 작동합니다 :

SELECT P.PROD_DESC, SUM(O.QTY) 
    FROM PROCUCTS_TBL AS P LEFT JOIN ORDERS_TBL AS O 
    ON P.PROD_ID = O.PROD_ID 
    GROUP BY P.PROD_ID, P.PROD_DESC 
    ORDER BY P.PROD_ID; 
0
보조 노트로
SELECT P.PROD_DESC, SUM(O.QTY) 
FROM PRODUCTS_TBL AS P LEFT JOIN ORDERS_TBL AS O 
ON P.PROD_ID = O.PROD_ID 
GROUP BY P.PROD_ID, PROD_DESC 
ORDER BY P.PROD_ID;