在多行SQL中使用匹配ID对Qtys求和

时间:2014-10-29 10:03:16

标签: sql sql-server-2008

我有一个sql查询,它返回一个包含ID,Qtys和Locations的结果表。一个项目可以位于多个位置,因此单个项目可以有四行,每行都是自己的位置,具有自己的数量。例如:

SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION
FROM Workshop w
LEFT OUTER JOIN ITEM_LIST i
ON i.ITEM_ID = w.ITEM_ID
GROUP BY i.ITEM_NO, w.QTY_ON_HAND, w. QTY_DAMAGED, w.LOACTION

返回:

-----------------------------------
|  ITEM_NO  |  QTY  |  LOCATION   | 
-----------------------------------
|  SN-15    |   0   |    SEA      |
-----------------------------------
|  SN-15    |   2   |    SFO      |
-----------------------------------
|  TY-14    |   1   |    SEA      |
-----------------------------------
|  TY-14    |   5   |    LAX      |
-----------------------------------
|  TY-14    |   0   |    SFO      |
-----------------------------------

我想要做的事情,理想情况是在同一个查询中,将每个位置的数量相加以找到每个ITEM_NO的总数量,结果表格如下:

---------------------------
|  ITEM_NO  |  TOTAL_QTY  | 
---------------------------
|  SN-15    |       2     |
---------------------------
|  TY-14    |       6     |
---------------------------

最好的方法是什么,我能在一个查询中完成所有操作吗?谢谢!

2 个答案:

答案 0 :(得分:1)

SELECT ITEM_NO, SUM(TOTAL_QTY) AS TOTAL_QTY FROM tablename GROUP BY ITEM_NO

GROUP BY会将每个ITEM_NO的结果分开......听起来有点令人困惑,但确实有意义。

编辑:在提出额外问题后

SELECT ITEM_NO, SUM(TOTAL_QTY) AS TOTAL_QTY FROM
(
  SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION
  FROM Workshop w
  LEFT OUTER JOIN ITEM_LIST i
  ON i.ITEM_ID = w.ITEM_ID
  GROUP BY i.ITEM_NO, w.QTY_ON_HAND, w. QTY_DAMAGED, w.LOACTION
) AS query1
GROUP BY ITEM_NO

您在此处所做的是使用您作为表格查询的结果来查询总和。 可以使用查询的每个结果,就像它是数据库中的表一样。

答案 1 :(得分:1)

这是一个基本的聚合查询。如果您要有效地使用SQL,您应该学习该语言的基础知识:

select t.item_no, sum(t.qty) as total_qty
from table t
group by t.item_no;

group by是该语言的基本组成部分。

编辑:

当然。最简单的方法是使用with

with t as (
      SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION
      FROM Workshop w LEFT OUTER JOIN
           ITEM_LIST i
           ON i.ITEM_ID = w.ITEM_ID
      GROUP BY i.ITEM_NO, w.QTY_ON_HAND, w. QTY_DAMAGED, w.LOCATION
     )
select t.item_no, sum(t.qty) as total_qty
from table t
group by t.item_no;

但是,这个查询并没有多大意义。您不需要group by中的两个数量。所以,试试这个:

with t as (
      SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION
      FROM Workshop w LEFT OUTER JOIN
           ITEM_LIST i
           ON i.ITEM_ID = w.ITEM_ID
      GROUP BY i.ITEM_NO, w.LOCATION
     )
select t.item_no, sum(t.qty) as total_qty
from table t
group by t.item_no;

进一步的简化就是:

      SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY
      FROM Workshop w LEFT OUTER JOIN
           ITEM_LIST i
           ON i.ITEM_ID = w.ITEM_ID
      GROUP BY i.ITEM_NO