This query listed tables without primary keys and this one shows how many of them there are and what is the percentage of total tables.
select all_tabs.[tables] as all_tables, no_pk.[tables] as no_pk_tables, cast(cast(100.0 * no_pk.[tables] / all_tabs.[tables] as decimal(36, 1)) as varchar) + '%' as no_pk_percent from (select count(*) as [tables] from sys.tables as tab left outer join sys.indexes as pk on tab.object_id = pk.object_id and pk.is_primary_key = 1 where pk.object_id is null) as no_pk inner join (select count(*) as [tables] from sys.tables) as all_tabs on 1 = 1
The query returns just one row.
Sample results that show how many tables don't have primary keys in the AdventureWorksLT database and the percentage it represents.