[英]MS SQL - Join with group by
我對SQL還是很陌生,可以從《 24小時內SAMS自我學習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分組的總和的輸出表的任何提示嗎?
在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行
問題在於,在大多數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_ID
PROD_DESC
都不唯一,則可以按沒有問題的出現的列進行分組。 這應該工作:
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;
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.