2014-03-26 48 views
0

我對SQL非常陌生,並從「SAMS在24小時內自學SQL」一書中學習它。我關心的是所有關於連接和分組選擇輸出。這裏是我的表的結構: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,這是我通常這樣做的(雖然我喜歡'min')。 – Blindy

+0

@ Blindy :)我喜歡max:DD – giammin

1

的問題是,在SQL的大多數口味,可以選擇不聚合必須出現在group by子句中的列。

如果PROD_DESC是每個PROD_ID獨特,那麼就按PROD_DESC,你將被罰款:

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_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;