Re: Two counts in one sql statement

From: ddf <oratune_at_msn.com>
Date: Mon, 20 Jul 2009 09:14:13 -0700 (PDT)
Message-ID: <9bea17f0-5e3d-4b62-9382-1225b5ab25e6_at_y19g2000yqy.googlegroups.com>



On Jul 20, 11:04�am, ddf <orat..._at_msn.com> wrote:
> On Jul 20, 10:39�am, "dn.p..._at_gmail.com" <dn.p..._at_gmail.com> wrote:
>
>
>
>
>
> > I have a table with 3 fields.
>
> > country � state � city
> > USA � � � �CA � � Los Angeles
> > USA � � � �CA � � �Sacramento
> > USA � � � �OR � � Portland
> > Canada � �ONT � Ottawa
>
> > Could I find total count for the US and counts for country-state combo
> > with one sql statement. I doubt whether this is possible. The output
> > should look like:
> > country � state � �C/S combo � Total C(ountry) count
>
> > USA � � � �CA � � � � �2 � � � � � � � � �3 � (2 in CA + 1 in OR)
> > USA � � � �OR � � � � �1 � � � � � � � � �3
>
> > TIA.
>
> Analytics are your friend:
>
> SQL> create table city_state(
> � 2 � � � � �country varchar2(30),
> � 3 � � � � �state � varchar2(30),
> � 4 � � � � �city � �varchar2(80)
> � 5 �);
>
> Table created.
>
> SQL>
> SQL> insert all
> � 2 �into city_state
> � 3 �values('USA','CA','Los Angeles')
> � 4 �into city_state
> � 5 �values('USA','CA','Sacramento')
> � 6 �into city_state
> � 7 �values('USA','OR','Portland')
> � 8 �into city_state
> � 9 �values('Canada','ONT','Ottawa')
> �10 �select * from dual;
>
> 4 rows created.
>
> SQL>
> SQL> commit;
>
> Commit complete.
>
> SQL>
> SQL> select country, state, count(*) over (partition by state)
> city_ct, count(*) over (partition by country) state_ct
> � 2 �from city_state
> � 3 �where country = 'USA'
> � 4 �order by 2;
>
> COUNTRY � � � � � � � � � � � �STATE
> CITY_CT � STATE_CT
> ------------------------------ ------------------------------
> ---------- ----------
> USA � � � � � � � � � � � � � �CA
> 2 � � � � �3
> USA � � � � � � � � � � � � � �CA
> 2 � � � � �3
> USA � � � � � � � � � � � � � �OR
> 1 � � � � �3
>
> SQL>
> SQL> select country, state, count(*) over (partition by state)
> city_ct, count(*) over (partition by country) state_ct
> � 2 �from city_state
> � 3 �order by country desc, state;
>
> COUNTRY � � � � � � � � � � � �STATE
> CITY_CT � STATE_CT
> ------------------------------ ------------------------------
> ---------- ----------
> USA � � � � � � � � � � � � � �CA
> 2 � � � � �3
> USA � � � � � � � � � � � � � �CA
> 2 � � � � �3
> USA � � � � � � � � � � � � � �OR
> 1 � � � � �3
> Canada � � � � � � � � � � � � ONT
> 1 � � � � �1
>
> SQL>
>
> David Fitzjarrell- Hide quoted text -
>
> - Show quoted text -

Either query will return correct results for the given data:

SQL> select country, state, count(*) over (partition by state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 where country = 'USA'
  4 order by 2;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          3
USA                            CA
2          3
USA                            OR
1          3

SQL>
SQL> select country, state, count(*) over (partition by country,state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 where country = 'USA'
  4 order by 2;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          3
USA                            CA
2          3
USA                            OR
1          3

SQL>
SQL> select country, state, count(*) over (partition by state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 order by country desc, state;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          3
USA                            CA
2          3
USA                            OR
1          3
Canada                         ONT
1          1

SQL>
SQL> select country, state, count(*) over (partition by country,state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 order by country desc, state;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          3
USA                            CA
2          3
USA                            OR
1          3
Canada                         ONT
1          1

SQL>
SQL> insert all
  2 into city_state
  3 values('USA','OK','Enid')
  4 into city_state
  5 values('USA','PA','Pittsburg')
  6 into city_state
  7 values('USA','OH','Cleveland')
  8 into city_state
  9 values('Canada','ONT','London')
 10 select * from dual;

4 rows created.

SQL>
SQL> commit;

Commit complete.

SQL>
SQL> select country, state, count(*) over (partition by state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 where country = 'USA'
  4 order by 2;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          6
USA                            CA
2          6
USA                            OH
1          6
USA                            OK
1          6
USA                            OR
1          6
USA                            PA
1          6

6 rows selected.

SQL>
SQL> select country, state, count(*) over (partition by country,state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 where country = 'USA'
  4 order by 2;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          6
USA                            CA
2          6
USA                            OH
1          6
USA                            OK
1          6
USA                            OR
1          6
USA                            PA
1          6

6 rows selected.

SQL>
SQL> select country, state, count(*) over (partition by state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 order by country desc, state;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          6
USA                            CA
2          6
USA                            OH
1          6
USA                            OK
1          6
USA                            OR
1          6
USA                            PA
1          6
Canada                         ONT
2          2
Canada                         ONT
2          2

8 rows selected.

SQL>
SQL> select country, state, count(*) over (partition by country,state) city_ct, count(*) over (partition by country) state_ct   2 from city_state
  3 order by country desc, state;

COUNTRY                        STATE

CITY_CT STATE_CT
------------------------------ ------------------------------
---------- ----------
USA                            CA
2          6
USA                            CA
2          6
USA                            OH
1          6
USA                            OK
1          6
USA                            OR
1          6
USA                            PA
1          6
Canada                         ONT
2          2
Canada                         ONT
2          2

8 rows selected.

SQL> David Fitzjarrell Received on Mon Jul 20 2009 - 11:14:13 CDT

Original text of this message