SQL添加一个额外的列,该列统计特定列的重复值
我好像休息了一天,似乎无法让这个查询正常工作SQL添加一个额外的列,该列统计特定列的重复值,sql,sql-server-2008-r2,count,distinct,Sql,Sql Server 2008 R2,Count,Distinct,我好像休息了一天,似乎无法让这个查询正常工作 STAT SHNO UPDD UPDT ORDERNO 30 SHN124 20141022 150048 40303021 30 SHN125 20141022 150048 40303021 40 SHN123 20141022 150048 403
STAT SHNO UPDD UPDT ORDERNO
30 SHN124 20141022 150048 40303021
30 SHN125 20141022 150048 40303021
40 SHN123 20141022 150048 40303020
最初,我不使用DISTINCT的查询包括重复两行:
STAT SHNO UPDD UPDT ORDERNO
40 ASN123 20141022 150048 40303020
30 ASN124 20141022 150048 40303021
30 ASN124 20141022 150048 40303021
40 ASN123 20141022 150048 40303020
30 ASN125 20141022 150048 40303021
STAT SHNO UPDD UPDT ORDERNO
30 SHN124 20141022 150048 40303021
30 SHN125 20141022 150048 40303021
40 SHN123 20141022 150048 40303020
我将查询更改为包含不同的:
SELECT DISTINCT
STAT, SHNO, UPDD, UPDT, ORDERNO
FROM
BLUEWATER
STAT SHNO UPDD UPDT ORDERNO
30 SHN124 20141022 150048 40303021
30 SHN125 20141022 150048 40303021
40 SHN123 20141022 150048 40303020
现在我得到了想要的结果集:
STAT SHNO UPDD UPDT ORDERNO
30 SHN124 20141022 150048 40303021
30 SHN125 20141022 150048 40303021
40 SHN123 20141022 150048 40303020
但是,我尝试使用COUNT在结果中生成一列,对ORDERNO不唯一的行进行计数,并希望获得以下结果:
STAT SHNO UPDD UPDT ORDERNO
30 SHN124 20141022 150048 40303021
30 SHN125 20141022 150048 40303021
40 SHN123 20141022 150048 40303020
STAT SHNO UPDD UPDT ORDERNO ORDERNOCOUNT
30 SHN124 20141022 150048 40303021 2
30 SHN125 20141022 150048 40303021 2
40 SHN123 20141022 150048 40303020 1
我只需要使用group by和COUNT()就可以了。。。你用的是什么版本
STAT SHNO UPDD UPDT ORDERNO
30 SHN124 20141022 150048 40303021
30 SHN125 20141022 150048 40303021
40 SHN123 20141022 150048 40303020
SELECT STAT, SHNO, UPDD, UPDT, ORDERNO,
COUNT(*) OVER (PARTITION BY ORDERNO) AS ORDERNOCOUNT
FROM BLUEWATER
GROUP BY STAT, SHNO, UPDD, UPDT, ORDERNO
作为子选择
STAT SHNO UPDD UPDT ORDERNO
30 SHN124 20141022 150048 40303021
30 SHN125 20141022 150048 40303021
40 SHN123 20141022 150048 40303020
SELECT gsub.STAT, gsub.SHNO, gsub.UPDD, gsub.UPDT, gsub.ORDERNO, sub.c AS ORDERNOCOUNT
FROM
(
SELECT STAT, SHNO, UPDD, UPDT, ORDERNO
FROM BLUEWATER
GROUP BY STAT, SHNO, UPDD, UPDT, ORDERNO
) gsub
JOIN (
SELECT ORDERNO, COUNT(*) as c
FROM BLUEWATER
GROUP BY ORDERNO
) as sub ON gsub.ORDERNO = sub.ORDERNO
对于前两个结果,你会得到1而不是2,因为
SHNO
changes…似乎更适合使用COUNT(*)OVER(partitionbyorderno)
但是,由于OP没有提到他们使用的版本…谢谢@Aaron。我使用的是SQL Server 2008版本10.50.1617,但我将把查询移植到运行在iseries上的DB2AS400@TobyDerrum:v10.50是SQL Server 2008 R2(与2008不同)@tobydrrum——DB2也有很多版本。但是,如果你使用9.7或之后,你应该是罚款。它将支持COUNT…OVERPlease标记和您正在使用的SQL Server版本,因此我们不必猜测。此外,您首先需要DISTINCT
,这一事实表明底层设计存在一个基本问题。(因为这些神秘的列名——谁给它们命名的?——我们很难猜出设计问题是什么。)这些名字对我来说也很神秘,我收到了一份电子表格,其中只描述了一些列,尽管我不需要全部。我没有客户端访问权限,也不认为总是通过VPN连接是切实可行的,所以我在SQLServerR2中重新创建了DB2表。谢谢你的帮助!