MS SQL - 与group by一起加入

Kal*_*ale 1 sql sql-server group-by

我对SQL非常陌生,并且从"SAMS Teach Yourself SQL in 24 hours"一书中学到了它.我关心的是连接和分组选择输出.这是我的表的结构:

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 );
Run Code Online (Sandbox Code Playgroud)

我想要实现的是通过我的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;
Run Code Online (Sandbox Code Playgroud)

上面的查询适用于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;
Run Code Online (Sandbox Code Playgroud)

有关如何使用PROD_DESC获取输出表的任何提示,PROD_ID的数量和组的总和?

gia*_*min 7

在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;
Run Code Online (Sandbox Code Playgroud)

无论如何,如果P.PROD_DESC列是相同的,最好将它包含在Group by子句中,或者如果你想要所有不同的P.PROD_ID,P.PROD_DESC行