【问题标题】:MS SQL - Join with group byMS SQL - 通过分组加入
【发布时间】:2014-03-26 14:43:28
【问题描述】:

我对 SQL 很陌生,从“SAMS 24 小时内自学 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 的数量和组的总和?

【问题讨论】:

  • 附带说明,我从来不理解人们对帽子的迷恋。感觉就像代码使您的眼睛大打出手。我的意思是确定在 1957 年你有 Fortran 需要它,但在 2014 年?
  • 为我工作,抱歉我试过了,我对你想做的事情没有任何问题。加上你没有给我们编译错误
  • 我在表格中使用了小写字母,但这个示例已经准备好与所有大写字母一起使用。你说得对,这里读起来有点难。
  • 您的 mysql 查询是 mysql 和其他主要数据库都不允许的一种糟糕的技术。你也不应该在 mysql 中使用它,因为结果可能不一致。您需要学会在所有数据库中正确地进行聚合,而不是使用愚蠢地允许 mysql 存在的错误快捷方式。

标签: sql sql-server group-by


【解决方案1】:

在 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 行

【讨论】:

  • +1,这是我通常的做法(虽然我喜欢min)。
  • @Blindy :) 我喜欢最大 :DD
【解决方案2】:

问题在于,在大多数 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;

【讨论】:

    【解决方案3】:
    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多