Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL计数(*)和分组依据-查找行之间的差异_Sql - Fatal编程技术网

SQL计数(*)和分组依据-查找行之间的差异

SQL计数(*)和分组依据-查找行之间的差异,sql,Sql,下面是我编写的一个SQL查询,用于查找每个产品ID proc_ID的总行数: SELECT proc_id, count(*) FROM proc WHERE grouping_primary = 'SLB' AND eff_date = '01-JUL-09' GROUP BY proc_id ORDER BY proc_id; 下面是上面SQL查询的结果: proc_id count(*) 01 626 02 624 03 626 04 624 05 622 06 624

下面是我编写的一个SQL查询,用于查找每个产品ID proc_ID的总行数:

SELECT proc_id, count(*)
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
GROUP BY proc_id
ORDER BY proc_id;
下面是上面SQL查询的结果:

proc_id count(*) 01 626 02 624 03 626 04 624 05 622 06 624 07 624 09 624 请注意,proc_id='01',proc_id='03',proc_id='05'的总计数与另一个proc_id不同,不等于624行


如何编写SQL查询以查找与其他进程id相比,进程id='01',进程id='03',进程id='05'的哪些进程id行不同?

如果您知道624是幻数:

SELECT proc_id, count(*)
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
GROUP BY proc_id
HAVING count(*) <> 624
ORDER BY proc_id;

首先,您需要定义使“624”正确的标准。这是平均数吗?这是最常发生的计数吗?这是你最喜欢的伯爵吗

然后,您可以使用HAVING子句来分隔与您的条件不匹配的项:

SELECT proc_id, count(*)
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
GROUP BY proc_id
HAVING count(*) <> 624
ORDER BY proc_id;
或:

试试这个:

SELECT proc_id, count(*)
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
GROUP BY proc_id
HAVING count(*) <> (select count(*) from proc z where proc_id in (1) group by proc_id)
ORDER BY proc_id;

你不能这样做。对于某些ProcId,具有该ProcId的行更少。换句话说,使该procId没有count=624的行是不存在的行。任何查询如何显示这些行


对于行太多的procid,如果并且这是大的,如果其他procid的624中的所有行都有一些属性,这些属性与太大的集合的624计数子集相同,那么您可能能够识别额外的行,但是无法识别缺少的行,您所能做的就是确定哪些procid的行太多或太少

如果我正确理解了您的问题,这与其他已发布的答案不同,您希望使proc_id 01不同的行吗?如果是这种情况,您需要连接所有应该相同的列,并查找差异。因此,要比较01和02:

 SELECT [01].*
 FROM (
    SELECT * FROM proc
    WHERE grouping_primary = 'SLB'
    AND eff_date = '01-JUL-09'
    AND proc_id = '01'
 ) as [01]
 FULL JOIN (
    SELECT * FROM proc
    WHERE grouping_primary = 'SLB'
    AND eff_date = '01-JUL-09'
    AND proc_id = '02'
 ) as [02] ON
    [01].col1 = [02].col1
    AND [01].col2 = [02].col2
    AND [01].col3 = [02].col3
    /* etc...just don't include proc_id */
 WHERE
    [01].proc_id IS NULL --no match in [02]
    OR [02].proc_id IS NULL --no match in [01]

我很确定MS Sql Server有一个行哈希函数,如果你有一堆列的话,它可能会更简单……但是我想不出它的名字。

好吧,为了找到额外的内容,你可以使用NOT in短语。要查找缺少的行,需要颠倒逻辑。这自然假设从proc_id到proc_id的所有624行都是相同的

SELECT proc_id, varying_column 
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
AND   varying_column NOT IN (SELECT b.varying_column 
                             FROM proc b
                             WHERE b.grouping_primary = 'SLB'
                             AND   b.eff_date = '01-JUL-09'
                             AND   b.proc_id = (SELECT FIRST a.proc_id
                                                FROM proc a
                                                WHERE a.grouping_primary = 'SLB'
                                                AND   a.eff_date = '01-JUL-09'
                                                AND   COUNT(a.*) = 624
                                                GROUP BY a.proc_id
                                                ORDER BY a.proc_id;))
ORDER BY proc_id, varying_column;

如果我对您的问题理解正确,我们需要更多关于表其余部分结构的信息,以生成有意义的内容。除此之外,据我所知,不同之处不在于列值,而在于具有该过程ID的行数。。。无论列值如何-
SELECT proc_id, varying_column 
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
AND   varying_column NOT IN (SELECT b.varying_column 
                             FROM proc b
                             WHERE b.grouping_primary = 'SLB'
                             AND   b.eff_date = '01-JUL-09'
                             AND   b.proc_id = (SELECT FIRST a.proc_id
                                                FROM proc a
                                                WHERE a.grouping_primary = 'SLB'
                                                AND   a.eff_date = '01-JUL-09'
                                                AND   COUNT(a.*) = 624
                                                GROUP BY a.proc_id
                                                ORDER BY a.proc_id;))
ORDER BY proc_id, varying_column;