簡體   English   中英

MS SQL-加入分組依據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM