SQL计数(*)和分组依据-查找行之间的差异
下面是我编写的一个SQL查询,用于查找每个产品ID proc_ID的总行数: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
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;