SQL删除一列上的重复项,然后聚合另一列上的重复项,而不使用;分区;关键词
使用以下查询:SQL删除一列上的重复项,然后聚合另一列上的重复项,而不使用;分区;关键词,sql,db2,filtering,Sql,Db2,Filtering,使用以下查询: SELECT STAT, SHNO, ORDERNO FROM BLUEWATER ORDER BY SHNO; STAT SHNO ORDERNO 40 ASN123 40303
SELECT STAT, SHNO, ORDERNO FROM BLUEWATER ORDER BY SHNO;
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
我可以得到以下信息:
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
我正在寻找一个查询,该查询将消除重复的SHNO行,然后创建第四列,该列是ORDERNO重复次数的总和(该总数是在消除SHNO重复之后计算的)
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
目标数据库是DB2。我目前不知道是什么版本,但会设法确定这一点,尽管我假设不是最新版本
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
我的目标是生成以下内容的查询:
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
解决方案需要避免使用PARTITION关键字,因为这个版本的DB2不接受它 我不熟悉DB2,但以下内容适用于大多数SQL版本:
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
SELECT STAT, SHNO, ORDERNO, count(1) OrderNoTotal
FROM BLUEWATER
GROUP BY STAT, SHNO, ORDERNO
ORDER BY SHNO;
@约翰比万
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
您的解决方案提供以下功能:
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 2
30 ASN124 40303021 2
30 ASN125 40303021 1
鉴于我正在寻求:
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
有两条记录具有40303021,因此在每个记录旁边是ORDERNOTOTAL中的值2
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
根据上述评论进行更新
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
DB2应该可以使用分区,但您始终可以将其表示为一个
join
:
STAT SHNO ORDERNO
40 ASN123 40303020
40 ASN123 40303020
30 ASN124 40303021
30 ASN124 40303021
30 ASN125 40303021
STAT SHNO ORDERNO ORDERNOTOTAL
40 ASN123 40303020 1
30 ASN124 40303021 2
30 ASN125 40303021 2
select sso.stat, sso.shno, sso.orderno, o.OrderNoTotal
from (select STAT, SHNO, ORDERNO
from BLUEWATER
group by STAT, SHNO, ORDERNO
) sso join
(select OrderNo, count(distinct SHNO) as OrderNoTotal
from BlueWater
group by OrderNo
) o
on o.OrderNo = sso.OrderNo;
以下哪个问题?你能发布生成第一个例子的代码吗?你说的总和是指计数吗?如果您所需示例中的asn123和asn125看起来是错误的,那么如果两行的SHNO值相等,但STAT和ORDERKING值不同,那么它们将是两个不同的组,并且此查询的目的是消除重复的SHNO,您不应该从组中删除SHNO吗?它们不应该有不同的统计值,因为我将把SHNO的所有统计值更新为相同的值。@kolonel:如果您有不同的值,那么是的,您将得到更多的行。但是,如果有不同的值,如何在同一行中显示同一列的两个值?您可以通过只显示2个值中的1个来解决这个问题(例如,使用
min(STAT)over(partitionby SHNO order by STAT)
或类似方法),但我的猜测(基于示例数据)是,这不是我们想要的。@JohnLBevan不幸的是,DB2数据库不喜欢使用分区。有办法绕过它吗?我在一个论坛上读到了一些可能与此相关的东西:它抱怨'附近的语法不正确(“.有什么我需要更正的吗?@TobyDrrum…我没有注意到任何明显的问题。抱歉,这一定是一个糟糕的复制粘贴工作。尽管现在计算错误。OrderNottal不排除ORDERNO-SHNO重复项,这是关键要求。