将重复记录合并并计算数量的SQL查询

5

我有一个Excel电子表格,它从SQL中提取记录。我想合并重复记录,并对匹配记录的qty字段求和。 我尝试在现有查询中添加select(sum)和group by命令,但由于我没有真正的SQL经验,所以没有做得很好。 我的表格看起来像这样:

item no.| item description | qty   | date 
1         red onion          5       20110405 
2         yellow onion       5       20110406 
1         red onion          10      20110405

我希望它看起来像这样:

item no.| item description | qty   | date
1         red onion          15      20110405
2         yellow onion       5       20110406

这是我使用的查询语句:

SELECT 
     OELINHST_SQL.item_no, OELINHST_SQL.item_desc_1, OELINHST_SQL.qty_ordered, oelinhst_sql.unit_weight,  OEHDRHST_SQL.shipping_dt, OEHDRHST_SQL.inv_dt
FROM
    OEHDRHST_SQL OEHDRHST_SQL,
    OELINHST_SQL OELINHST_SQL
WHERE
    OEHDRHST_SQL.ord_type *= OELINHST_SQL.ord_type AND
    OEHDRHST_SQL.ord_no *= OELINHST_SQL.ord_no AND
    (OELINHST_SQL.prod_cat <> '26' AND
    OELINHST_SQL.prod_cat <> '25') AND
    OELINHST_SQL.loc = 'fs2' AND 
    OELINHST_SQL.item_desc_1 IS NOT NULL AND 
    OEHDRHST_SQL.shipping_dt >= 20110101 AND
    OELINHST_SQL.item_no NOT IN ('800-505-00', '800-083-00', '800-506-00', '400-511-39')  AND (OELINHST_SQL.item_no NOT BETWEEN '800-000-00' AND '999-999-99')
ORDER BY
    OELINHST_SQL.item_no ASC,
    OEHDRHST_SQL.inv_dt DESC

你要找的词是[GROUP BY]和[SUM]。 - τεκ
你的样本数据看起来只有一个表,但查询显然引用了两个表。你能给我们提供你特定情况下的所有细节吗? - Joe Stefanelli
您的查询结果中列出的列与您的结果不一致,有额外的列。此外,如果您在使用SUM()时包含了尝试和原因,那将会很有帮助。您是否遇到了错误?或者得到了错误的结果?几乎可以确定,您应该使用SUM()函数。 - Tom H
抱歉,我的确切表格使用这些字段:item_no | item_desc_1 | qty_ordered |unit_weight |shipping_dt |inv_d,然后我在Excel中添加一个字段,将SQL日期转换为Excel可以识别的格式。之前,我尝试使用Sum和Group By,像这样: SELECT OELINHST_SQL.item_no,OELINHST_SQL.item_desc_1, (SELECT sum(OELINHST_SQL.qty_ordered) FROM OELINHST_SQL group by OELINHST_SQL.item_no) FROM OELINHST_SQL 但是这给了我一个“子查询不能返回多个值”的错误。 - NX5
4个回答

9
你需要使用 GROUP BY 子句并对相关列进行 SUM。以下是一个简化的示例,可以根据你的情况进行调整。
select t1.name, t2.name, t2.date, sum(t2.orders)
from table1 t1
inner join table2 t2 on t1.id = t2.t1_id
group by t1.name, t2.name, t2.date

1

看起来你需要添加一个group by子句,并且加上SUM(Qty)和MIN(date)

不太确定你的列名,但可能是这样:

SELECT 
     OELINHST_SQL.item_no, OELINHST_SQL.item_desc_1, SUM(OELINHST_SQL.qty_ordered), oelinhst_sql.unit_weight,  MIN(OEHDRHST_SQL.shipping_dt), MIN(OEHDRHST_SQL.inv_dt)
FROM
    OEHDRHST_SQL OEHDRHST_SQL,
    OELINHST_SQL OELINHST_SQL
WHERE
    OEHDRHST_SQL.ord_type *= OELINHST_SQL.ord_type AND
    OEHDRHST_SQL.ord_no *= OELINHST_SQL.ord_no AND
    (OELINHST_SQL.prod_cat <> '26' AND
    OELINHST_SQL.prod_cat <> '25') AND
    OELINHST_SQL.loc = 'fs2' AND 
    OELINHST_SQL.item_desc_1 IS NOT NULL AND 
    OEHDRHST_SQL.shipping_dt >= 20110101 AND
    OELINHST_SQL.item_no NOT IN ('800-505-00', '800-083-00', '800-506-00', '400-511-39')  AND (OELINHST_SQL.item_no NOT BETWEEN '800-000-00' AND '999-999-99')
GROUP BY OELINHST_SQL.item_no, OELINHST_SQL.item_desc_1, oelinhst_sql.unit_weight
ORDER BY
    OELINHST_SQL.item_no ASC,
    OEHDRHST_SQL.inv_dt DESC

0
我认为你想要这样的东西:
SELECT 
       OELINHST_SQL.item_no, 
       OELINHST_SQL.item_desc_1, 
       SUM(OELINHST_SQL.qty_ordered),
       SUM(oelinhst_sql.unit_weight),  
       MIN(OEHDRHST_SQL.shipping_dt), 
       MIN(OEHDRHST_SQL.inv_dt)
    FROM
        OEHDRHST_SQL OEHDRHST_SQL,
        OELINHST_SQL OELINHST_SQL
    WHERE
        OEHDRHST_SQL.ord_type *= OELINHST_SQL.ord_type AND
        OEHDRHST_SQL.ord_no *= OELINHST_SQL.ord_no AND
        (OELINHST_SQL.prod_cat <> '26' AND
        OELINHST_SQL.prod_cat <> '25') AND
        OELINHST_SQL.loc = 'fs2' AND 
        OELINHST_SQL.item_desc_1 IS NOT NULL AND 
        OEHDRHST_SQL.shipping_dt >= 20110101 AND
        OELINHST_SQL.item_no NOT IN ('800-505-00', '800-083-00', '800-506-00', '400-511-39')  AND (OELINHST_SQL.item_no NOT BETWEEN '800-000-00' AND '999-999-99')
    GROUP BY
       OELINHST_SQL.item_no, 
       OELINHST_SQL.item_desc_1
    ORDER BY
        OELINHST_SQL.item_no ASC,
        OEHDRHST_SQL.inv_dt DESC

但是,这假设发货日期和int_date始终相同,或者您希望在两种情况下都获得最早的日期。


0

我添加了更简单的表别名,以使其更易于阅读。基本上,您需要按未包含在聚合函数中的所有列进行分组。

SELECT 
  l.item_no
 ,l.item_desc_1
 ,SUM(l.qty_ordered) AS qty_ordered
 ,l.unit_weight
 ,h.shipping_dt
 ,h.inv_dt
FROM OEHDRHST_SQL h
  LEFT OUTER JOIN OELINHST_SQL l ON h.ord_type = l.ord_type AND h.ord_no = l.ord_no
WHERE l.prod_cat <> '26'
  AND l.prod_cat <> '25'
  AND l.loc = 'fs2'
  AND l.item_desc_1 IS NOT NULL
  AND h.shipping_dt >= 20110101
  AND l.item_no NOT IN ('800-505-00', '800-083-00', '800-506-00', '400-511-39')
  AND l.item_no NOT BETWEEN '800-000-00' AND '999-999-99'
GROUP BY l.item_no, l.item_desc_1, l.unit_weight, h.shipping_dt, h.inv_dt
ORDER BY l.item_no ASC, h.inv_dt DESC

1
Rob,看起来你的查询很有效!但是有一个问题;我能否在Group By子句中排除inv_dt,但仍将其作为表的一部分?本质上,我想从具有匹配的物品描述、物品编号和发货日期的每个记录中汇总数量。 - NX5
在结果集中包含inv_dt的目的是什么?如果有不同的值,您会为给定行选择哪个值?规则是它必须被包含在group by或聚合函数中。您可以删除它,然后在查询中使用MIN(inv_dt)或MAX(inv_dt)。希望这可以帮助! - Rob Boek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接