结合GROUP BY和LIKE SQL

时间:2015-10-07 06:51:56

标签: sql oracle join count group-by

我的目标是显示第二列中具有20+值的状态。 目前我已经能够显示状态和值,但我需要组合相似的状态和它们的值(例如VIC和Vic和vic应该等于VIC 68)。 我也只想显示状态,而不是它们的值,但值继续显示。我猜它使用LIKE结合GROUP BY但我无法弄清楚如何。

我当前的SQL查询:

SELECT DEPARTMENT.STATE, COUNT(ACADEMIC.DEPTNUM) FROM ACADEMIC
JOIN DEPARTMENT
ON DEPARTMENT.DEPTNUM=ACADEMIC.DEPTNUM
GROUP BY DEPARTMENT.STATE;

输出:

STATE COUNT(ACADEMIC.DEPTNUM)
----- -----------------------
NSW                        82 
                            7 
QLD                        21 
VIC                        14 
vic                         1 
WA                         42 
Tas                         1 
SA                         40 
Qld                        55 
Vic                        53 
ACT                        35 
TAS                         8 

我不知道怎么做,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

IsComposite(InitialCandidate, Candidate):
    For all Prefixes of Candidate:
        if Prefix is in Words:
            Suffix= Candidate - Prefix
            if Suffix == "":
                return Candidate != InitialCandidate
            else:
                return IsComposite(InitialCandidate, Suffix)

For all Candidate words by decreasing size:
    if IsComposite(Candidate, Candidate):
        print Candidate
        break

使用SELECT DEPARTMENT.STATE, COUNT(ACADEMIC.DEPTNUM) FROM ACADEMIC JOIN DEPARTMENT ON DEPARTMENT.DEPTNUM=ACADEMIC.DEPTNUM GROUP BY DEPARTMENT.STATE HAVING COUNT(ACADEMIC.DEPTNUM) >= 20; 仅返回计数为20 +的行。

要处理不同的情况,请在所有状态下执行HAVING

UPPER

答案 1 :(得分:0)

  

我需要结合相似的状态和它们的值(例如VIC和Vic和vic应该等于VIC 68)

您需要在子查询中使用 SUM GROUP BY(UPPER / LOWER),或者只需使用 UPPER / LOWER 原始查询中的 GROUP BY 表达式。

例如,

SQL> with data as(
  2  select 'VIC' state, 14 cnt from dual union all
  3  select 'vic' state, 1  cnt from dual union all
  4  select 'Vic' state, 53  cnt from dual
  5  )
  6  select upper(state), sum(cnt) count
  7  from data
  8  group by upper(state);

UPP      COUNT
--- ----------
VIC         68

由于您已经拥有了可以计算的子查询,因此您需要在 GROUP BY 中使用 UPPER / LOWER ,以便计数现在会考虑类似的状态

SELECT UPPER(DEPARTMENT.STATE) AS "STATE"
FROM ACADEMIC
JOIN DEPARTMENT
ON DEPARTMENT.DEPTNUM=ACADEMIC.DEPTNUM
GROUP BY UPPER(DEPARTMENT.STATE)
HAVING COUNT(ACADEMIC.DEPTNUM) >= 20;