Chapter 24: PostgreSQL COUNT Function
Part 1: What is the COUNT Function?
The COUNT function returns the number of rows that match a specified condition. It’s an aggregate function that comes in several flavors:
-
COUNT(*) – Counts all rows in a table or group
-
COUNT(column) – Counts non-NULL values in a specific column
-
COUNT(DISTINCT column) – Counts unique non-NULL values
The Basic Syntax
|
0 1 2 3 4 5 6 7 8 |
<span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> table_name<span class="token punctuation">;</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>column_name<span class="token punctuation">)</span> <span class="token keyword">FROM</span> table_name<span class="token punctuation">;</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> column_name<span class="token punctuation">)</span> <span class="token keyword">FROM</span> table_name<span class="token punctuation">;</span> |
Part 2: Setting Up Our Example Data
Let’s create a rich dataset to explore all the ways COUNT can be used:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
<span class="token comment">-- Create an e-commerce database with multiple tables</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> customers <span class="token punctuation">(</span> customer_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> first_name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">,</span> last_name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">,</span> email <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> city <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">,</span> state <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> signup_date <span class="token keyword">DATE</span><span class="token punctuation">,</span> is_active <span class="token keyword">BOOLEAN</span><span class="token punctuation">,</span> loyalty_tier <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> products <span class="token punctuation">(</span> product_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> category <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">,</span> price <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stock_quantity <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> launch_date <span class="token keyword">DATE</span><span class="token punctuation">,</span> is_discontinued <span class="token keyword">BOOLEAN</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">FALSE</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> orders <span class="token punctuation">(</span> order_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> customer_id <span class="token keyword">INTEGER</span> <span class="token keyword">REFERENCES</span> customers<span class="token punctuation">(</span>customer_id<span class="token punctuation">)</span><span class="token punctuation">,</span> order_date <span class="token keyword">DATE</span><span class="token punctuation">,</span> <span class="token keyword">status</span> <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">,</span> total_amount <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> order_items <span class="token punctuation">(</span> order_item_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> order_id <span class="token keyword">INTEGER</span> <span class="token keyword">REFERENCES</span> orders<span class="token punctuation">(</span>order_id<span class="token punctuation">)</span><span class="token punctuation">,</span> product_id <span class="token keyword">INTEGER</span> <span class="token keyword">REFERENCES</span> products<span class="token punctuation">(</span>product_id<span class="token punctuation">)</span><span class="token punctuation">,</span> quantity <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> unit_price <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> reviews <span class="token punctuation">(</span> review_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> product_id <span class="token keyword">INTEGER</span> <span class="token keyword">REFERENCES</span> products<span class="token punctuation">(</span>product_id<span class="token punctuation">)</span><span class="token punctuation">,</span> customer_id <span class="token keyword">INTEGER</span> <span class="token keyword">REFERENCES</span> customers<span class="token punctuation">(</span>customer_id<span class="token punctuation">)</span><span class="token punctuation">,</span> rating <span class="token keyword">INTEGER</span> <span class="token keyword">CHECK</span> <span class="token punctuation">(</span>rating <span class="token operator">>=</span> <span class="token number">1</span> <span class="token operator">AND</span> rating <span class="token operator"><=</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span> review_text <span class="token keyword">TEXT</span><span class="token punctuation">,</span> review_date <span class="token keyword">DATE</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Insert customers (50 customers with varied data)</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> customers <span class="token punctuation">(</span>first_name<span class="token punctuation">,</span> last_name<span class="token punctuation">,</span> email<span class="token punctuation">,</span> city<span class="token punctuation">,</span> state<span class="token punctuation">,</span> signup_date<span class="token punctuation">,</span> is_active<span class="token punctuation">,</span> loyalty_tier<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token string">'Alice'</span><span class="token punctuation">,</span> <span class="token string">'Johnson'</span><span class="token punctuation">,</span> <span class="token string">'alice.j@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Austin'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-01-15'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Gold'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Bob'</span><span class="token punctuation">,</span> <span class="token string">'Smith'</span><span class="token punctuation">,</span> <span class="token string">'bob.smith@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Dallas'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-02-20'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Silver'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Carol'</span><span class="token punctuation">,</span> <span class="token string">'White'</span><span class="token punctuation">,</span> <span class="token string">'carol.w@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Houston'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-03-10'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Gold'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'David'</span><span class="token punctuation">,</span> <span class="token string">'Brown'</span><span class="token punctuation">,</span> <span class="token string">'david.b@email.com'</span><span class="token punctuation">,</span> <span class="token string">'San Antonio'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-01-05'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token string">'Bronze'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Eva'</span><span class="token punctuation">,</span> <span class="token string">'Green'</span><span class="token punctuation">,</span> <span class="token string">'eva.g@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Austin'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-04-12'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Silver'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Frank'</span><span class="token punctuation">,</span> <span class="token string">'Black'</span><span class="token punctuation">,</span> <span class="token string">'frank.b@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Dallas'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-05-18'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Bronze'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Grace'</span><span class="token punctuation">,</span> <span class="token string">'Lee'</span><span class="token punctuation">,</span> <span class="token string">'grace.l@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Houston'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-06-22'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token string">'Bronze'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Henry'</span><span class="token punctuation">,</span> <span class="token string">'Ford'</span><span class="token punctuation">,</span> <span class="token string">'henry.f@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Austin'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-07-30'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Gold'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Iris'</span><span class="token punctuation">,</span> <span class="token string">'West'</span><span class="token punctuation">,</span> <span class="token string">'iris.w@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Dallas'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-08-14'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Silver'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Jack'</span><span class="token punctuation">,</span> <span class="token string">'Ryan'</span><span class="token punctuation">,</span> <span class="token string">'jack.r@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Houston'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-09-05'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Bronze'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">-- Add 40 more customers with similar pattern...</span> <span class="token punctuation">(</span><span class="token string">'Kevin'</span><span class="token punctuation">,</span> <span class="token string">'Hart'</span><span class="token punctuation">,</span> <span class="token string">'kevin.h@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Austin'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-10-01'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Gold'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Lisa'</span><span class="token punctuation">,</span> <span class="token string">'Chen'</span><span class="token punctuation">,</span> <span class="token string">'lisa.c@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Dallas'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-10-15'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Silver'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Mike'</span><span class="token punctuation">,</span> <span class="token string">'Davis'</span><span class="token punctuation">,</span> <span class="token string">'mike.d@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Houston'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-11-01'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token string">'Bronze'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Nancy'</span><span class="token punctuation">,</span> <span class="token string">'Wilson'</span><span class="token punctuation">,</span> <span class="token string">'nancy.w@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Austin'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-11-15'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Silver'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Oscar'</span><span class="token punctuation">,</span> <span class="token string">'Martinez'</span><span class="token punctuation">,</span> <span class="token string">'oscar.m@email.com'</span><span class="token punctuation">,</span> <span class="token string">'Dallas'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-12-01'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Bronze'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Insert products (30 products across categories)</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> products <span class="token punctuation">(</span>name<span class="token punctuation">,</span> category<span class="token punctuation">,</span> price<span class="token punctuation">,</span> stock_quantity<span class="token punctuation">,</span> launch_date<span class="token punctuation">,</span> is_discontinued<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token string">'Wireless Headphones'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token string">'2024-01-15'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Gaming Mouse'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">49.99</span><span class="token punctuation">,</span> <span class="token number">120</span><span class="token punctuation">,</span> <span class="token string">'2024-01-20'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Mechanical Keyboard'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">129.99</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token string">'2024-01-10'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'4K Monitor'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">399.99</span><span class="token punctuation">,</span> <span class="token number">18</span><span class="token punctuation">,</span> <span class="token string">'2024-01-05'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'USB-C Hub'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">39.99</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token string">'2024-01-25'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Coffee Maker'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">79.99</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">,</span> <span class="token string">'2024-01-12'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Blender'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">129.99</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token string">'2024-01-18'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Toaster'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">34.99</span><span class="token punctuation">,</span> <span class="token number">55</span><span class="token punctuation">,</span> <span class="token string">'2024-01-22'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Air Fryer'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">149.99</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token string">'2024-01-08'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Microwave'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">199.99</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token string">'2024-01-28'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Desk Chair'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">249.99</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token string">'2024-01-03'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Standing Desk'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">499.99</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token string">'2024-01-07'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Bookshelf'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">159.99</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token string">'2024-01-14'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Lamp'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">45.99</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token string">'2024-01-19'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Office Cabinet'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">189.99</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token string">'2024-01-24'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Running Shoes'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">'2024-01-02'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Yoga Mat'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">24.99</span><span class="token punctuation">,</span> <span class="token number">150</span><span class="token punctuation">,</span> <span class="token string">'2024-01-09'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Dumbbells Set'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">79.99</span><span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">,</span> <span class="token string">'2024-01-16'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Water Bottle'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token string">'2024-01-21'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Gym Bag'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">39.99</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token string">'2024-01-26'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Great Gatsby'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">11.99</span><span class="token punctuation">,</span> <span class="token number">85</span><span class="token punctuation">,</span> <span class="token string">'2024-01-04'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'1984'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">10.99</span><span class="token punctuation">,</span> <span class="token number">92</span><span class="token punctuation">,</span> <span class="token string">'2024-01-11'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'To Kill a Mockingbird'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">12.99</span><span class="token punctuation">,</span> <span class="token number">78</span><span class="token punctuation">,</span> <span class="token string">'2024-01-17'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Pride and Prejudice'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">9.99</span><span class="token punctuation">,</span> <span class="token number">110</span><span class="token punctuation">,</span> <span class="token string">'2024-01-23'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Hobbit'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token number">65</span><span class="token punctuation">,</span> <span class="token string">'2024-01-27'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">-- Add discontinued products</span> <span class="token punctuation">(</span><span class="token string">'Old Smartphone'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">199.99</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token string">'2022-01-15'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'CRT Monitor'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">49.99</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token string">'2020-06-01'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Vintage Radio'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">29.99</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">'2019-03-10'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Cassette Player'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">19.99</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token string">'2018-11-20'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Film Camera'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">'2017-08-05'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Insert orders (100 orders)</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> orders <span class="token punctuation">(</span>customer_id<span class="token punctuation">,</span> order_date<span class="token punctuation">,</span> <span class="token keyword">status</span><span class="token punctuation">,</span> total_amount<span class="token punctuation">)</span> <span class="token keyword">SELECT</span> customer_id<span class="token punctuation">,</span> <span class="token string">'2024-01-01'</span>::<span class="token keyword">DATE</span> <span class="token operator">+</span> <span class="token punctuation">(</span>random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">60</span><span class="token punctuation">)</span>::<span class="token keyword">INT</span><span class="token punctuation">,</span> <span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0.7</span> <span class="token keyword">THEN</span> <span class="token string">'delivered'</span> <span class="token keyword">WHEN</span> random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0.9</span> <span class="token keyword">THEN</span> <span class="token string">'shipped'</span> <span class="token keyword">ELSE</span> <span class="token string">'pending'</span> <span class="token keyword">END</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">500</span> <span class="token operator">+</span> <span class="token number">20</span><span class="token punctuation">)</span>::<span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> customers <span class="token keyword">CROSS</span> <span class="token keyword">JOIN</span> generate_series<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token comment">-- 7 orders per customer on average</span> <span class="token keyword">LIMIT</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token comment">-- Insert order items (multiple items per order)</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> order_items <span class="token punctuation">(</span>order_id<span class="token punctuation">,</span> product_id<span class="token punctuation">,</span> quantity<span class="token punctuation">,</span> unit_price<span class="token punctuation">)</span> <span class="token keyword">SELECT</span> o<span class="token punctuation">.</span>order_id<span class="token punctuation">,</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">,</span> <span class="token punctuation">(</span>random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>::<span class="token keyword">INT</span><span class="token punctuation">,</span> p<span class="token punctuation">.</span>price <span class="token keyword">FROM</span> orders o <span class="token keyword">CROSS</span> <span class="token keyword">JOIN</span> LATERAL <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> product_id<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> <span class="token operator">NOT</span> is_discontinued <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">LIMIT</span> <span class="token punctuation">(</span>random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>::<span class="token keyword">INT</span> <span class="token punctuation">)</span> p<span class="token punctuation">;</span> <span class="token comment">-- Insert reviews (some products have reviews, some don't)</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> reviews <span class="token punctuation">(</span>product_id<span class="token punctuation">,</span> customer_id<span class="token punctuation">,</span> rating<span class="token punctuation">,</span> review_text<span class="token punctuation">,</span> review_date<span class="token punctuation">)</span> <span class="token keyword">SELECT</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">,</span> c<span class="token punctuation">.</span>customer_id<span class="token punctuation">,</span> <span class="token punctuation">(</span>random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>::<span class="token keyword">INT</span><span class="token punctuation">,</span> <span class="token string">'Sample review text...'</span><span class="token punctuation">,</span> <span class="token string">'2024-01-01'</span>::<span class="token keyword">DATE</span> <span class="token operator">+</span> <span class="token punctuation">(</span>random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">60</span><span class="token punctuation">)</span>::<span class="token keyword">INT</span> <span class="token keyword">FROM</span> products p <span class="token keyword">CROSS</span> <span class="token keyword">JOIN</span> customers c <span class="token keyword">WHERE</span> random<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0.3</span> <span class="token comment">-- 30% of product-customer pairs have reviews</span> <span class="token keyword">LIMIT</span> <span class="token number">200</span><span class="token punctuation">;</span> |
Part 3: The Three Flavors of COUNT
1. COUNT(*) – Count All Rows
This counts every row in the table, regardless of NULL values:
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">-- Count all customers</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_customers <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
Result:
| total_customers |
|---|
| 50 |
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">-- Count all orders</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_orders <span class="token keyword">FROM</span> orders<span class="token punctuation">;</span> |
Result:
| total_orders |
|---|
| 100 |
Important: COUNT(*) includes rows even if all columns are NULL. It’s counting rows, not values.
2. COUNT(column) – Count Non-NULL Values
This counts only rows where the specified column is NOT NULL:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Count customers who have email addresses (all do in our data)</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span> <span class="token keyword">AS</span> customers_with_email <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> <span class="token comment">-- Count products with reviews (using a subquery for demonstration)</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>review_text<span class="token punctuation">)</span> <span class="token keyword">AS</span> products_with_reviews <span class="token keyword">FROM</span> reviews<span class="token punctuation">;</span> |
The real power shows when you have NULL values:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- Let's add some NULL emails</span> <span class="token keyword">UPDATE</span> customers <span class="token keyword">SET</span> email <span class="token operator">=</span> <span class="token boolean">NULL</span> <span class="token keyword">WHERE</span> customer_id <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Now compare</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_customers<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span> <span class="token keyword">AS</span> customers_with_email<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span> <span class="token keyword">AS</span> customers_missing_email <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
Result:
| total_customers | customers_with_email | customers_missing_email |
|---|---|---|
| 50 | 47 | 3 |
3. COUNT(DISTINCT column) – Count Unique Values
This counts the number of unique, non-NULL values in a column:
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">-- How many unique cities do our customers come from?</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> city<span class="token punctuation">)</span> <span class="token keyword">AS</span> unique_cities <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
Result:
| unique_cities |
|---|
| 4 |
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">-- How many unique states?</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> state<span class="token punctuation">)</span> <span class="token keyword">AS</span> unique_states <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
Result:
| unique_states |
|---|
| 1 |
(All our customers are in Texas for this example)
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">-- More interesting: count distinct products ordered</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> product_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> products_ordered <span class="token keyword">FROM</span> order_items<span class="token punctuation">;</span> |
Part 4: COUNT with WHERE Clause
Filter rows before counting:
1. Count Active Customers
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_customers<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> is_active <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> active_customers<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> <span class="token operator">NOT</span> is_active <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> inactive_customers <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
Or more simply:
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_customers<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> is_active<span class="token punctuation">)</span> <span class="token keyword">AS</span> active_customers<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token operator">NOT</span> is_active<span class="token punctuation">)</span> <span class="token keyword">AS</span> inactive_customers <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
2. Count by Status
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Count orders by status</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_orders<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'delivered'</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> delivered<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'shipped'</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> shipped<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'pending'</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> pending <span class="token keyword">FROM</span> orders<span class="token punctuation">;</span> |
3. Count with Multiple Conditions
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Count high-value orders from active customers</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> high_value_orders <span class="token keyword">FROM</span> orders o <span class="token keyword">JOIN</span> customers c <span class="token keyword">ON</span> o<span class="token punctuation">.</span>customer_id <span class="token operator">=</span> c<span class="token punctuation">.</span>customer_id <span class="token keyword">WHERE</span> o<span class="token punctuation">.</span>total_amount <span class="token operator">></span> <span class="token number">200</span> <span class="token operator">AND</span> c<span class="token punctuation">.</span>is_active <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token operator">AND</span> o<span class="token punctuation">.</span><span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'delivered'</span><span class="token punctuation">;</span> |
Part 5: COUNT with GROUP BY
This is where COUNT becomes a powerful analytical tool – counting within groups.
1. Count by Category
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Count products in each category</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> product_count <span class="token keyword">FROM</span> products <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> product_count <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Result:
| category | product_count |
|---|---|
| Electronics | 9 |
| Appliances | 5 |
| Furniture | 5 |
| Sports | 5 |
| Books | 5 |
2. Multiple Grouping Columns
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Count customers by city and loyalty tier</span> <span class="token keyword">SELECT</span> city<span class="token punctuation">,</span> loyalty_tier<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> customer_count <span class="token keyword">FROM</span> customers <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> city<span class="token punctuation">,</span> loyalty_tier <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> city<span class="token punctuation">,</span> loyalty_tier<span class="token punctuation">;</span> |
Result (partial):
| city | loyalty_tier | customer_count |
|---|---|---|
| Austin | Bronze | 2 |
| Austin | Gold | 3 |
| Austin | Silver | 2 |
| Dallas | Bronze | 2 |
| Dallas | Gold | 1 |
| … | … | … |
3. Count with Joins
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- For each product, count how many times it's been ordered</span> <span class="token keyword">SELECT</span> p<span class="token punctuation">.</span>name<span class="token punctuation">,</span> p<span class="token punctuation">.</span>category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>oi<span class="token punctuation">.</span>order_item_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> times_ordered<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> o<span class="token punctuation">.</span>customer_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> unique_customers <span class="token keyword">FROM</span> products p <span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> order_items oi <span class="token keyword">ON</span> p<span class="token punctuation">.</span>product_id <span class="token operator">=</span> oi<span class="token punctuation">.</span>product_id <span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> orders o <span class="token keyword">ON</span> oi<span class="token punctuation">.</span>order_id <span class="token operator">=</span> o<span class="token punctuation">.</span>order_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">,</span> p<span class="token punctuation">.</span>name<span class="token punctuation">,</span> p<span class="token punctuation">.</span>category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> times_ordered <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Note: The LEFT JOIN ensures products with zero orders still appear.
Part 6: COUNT with HAVING
Filter groups based on their count:
1. Find Popular Products
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- Products ordered more than 5 times</span> <span class="token keyword">SELECT</span> p<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>oi<span class="token punctuation">.</span>order_item_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> order_count <span class="token keyword">FROM</span> products p <span class="token keyword">JOIN</span> order_items oi <span class="token keyword">ON</span> p<span class="token punctuation">.</span>product_id <span class="token operator">=</span> oi<span class="token punctuation">.</span>product_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">,</span> p<span class="token punctuation">.</span>name <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>oi<span class="token punctuation">.</span>order_item_id<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">5</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> order_count <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
2. Find Active Categories
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Categories with at least 5 products</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> product_count <span class="token keyword">FROM</span> products <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token number">5</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> product_count <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
3. Find High-Value Customers
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- Customers with at least 3 orders and total spent > $500</span> <span class="token keyword">SELECT</span> c<span class="token punctuation">.</span>first_name<span class="token punctuation">,</span> c<span class="token punctuation">.</span>last_name<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> order_count<span class="token punctuation">,</span> <span class="token function">SUM</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>total_amount<span class="token punctuation">)</span> <span class="token keyword">AS</span> total_spent <span class="token keyword">FROM</span> customers c <span class="token keyword">JOIN</span> orders o <span class="token keyword">ON</span> c<span class="token punctuation">.</span>customer_id <span class="token operator">=</span> o<span class="token punctuation">.</span>customer_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> c<span class="token punctuation">.</span>customer_id<span class="token punctuation">,</span> c<span class="token punctuation">.</span>first_name<span class="token punctuation">,</span> c<span class="token punctuation">.</span>last_name <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_id<span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token number">3</span> <span class="token operator">AND</span> <span class="token function">SUM</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>total_amount<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">500</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> total_spent <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Part 7: Conditional Counting with FILTER
PostgreSQL offers a cleaner syntax for conditional counts:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Count orders by status using FILTER</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_orders<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> delivered<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'shipped'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> shipped<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'pending'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> pending <span class="token keyword">FROM</span> orders<span class="token punctuation">;</span> |
This is often more readable than CASE statements:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Compare with CASE approach</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_orders<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'delivered'</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> delivered<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'shipped'</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> shipped<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'pending'</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> pending <span class="token keyword">FROM</span> orders<span class="token punctuation">;</span> |
Complex FILTER Conditions
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment">-- Count high-value orders in each status</span> <span class="token keyword">SELECT</span> <span class="token keyword">status</span><span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> total_amount <span class="token operator">></span> <span class="token number">200</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> high_value<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> total_amount <span class="token operator">BETWEEN</span> <span class="token number">100</span> <span class="token operator">AND</span> <span class="token number">200</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> medium_value<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> total_amount <span class="token operator"><</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> low_value <span class="token keyword">FROM</span> orders <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> <span class="token keyword">status</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> <span class="token keyword">status</span><span class="token punctuation">;</span> |
Part 8: COUNT with Window Functions
Window functions let you count while keeping all rows:
1. Running Count
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Show each order with running total of orders per customer</span> <span class="token keyword">SELECT</span> customer_id<span class="token punctuation">,</span> order_date<span class="token punctuation">,</span> total_amount<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token keyword">PARTITION</span> <span class="token keyword">BY</span> customer_id <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> order_number <span class="token keyword">FROM</span> orders <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> customer_id<span class="token punctuation">,</span> order_date<span class="token punctuation">;</span> |
2. Total Count in Each Row
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Show each product with total products in its category</span> <span class="token keyword">SELECT</span> name<span class="token punctuation">,</span> category<span class="token punctuation">,</span> price<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token keyword">PARTITION</span> <span class="token keyword">BY</span> category<span class="token punctuation">)</span> <span class="token keyword">AS</span> products_in_category <span class="token keyword">FROM</span> products <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> category<span class="token punctuation">,</span> name<span class="token punctuation">;</span> |
3. Percentage of Total
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Calculate each category's percentage of total products</span> <span class="token keyword">SELECT</span> <span class="token keyword">DISTINCT</span> category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token keyword">PARTITION</span> <span class="token keyword">BY</span> category<span class="token punctuation">)</span> <span class="token keyword">AS</span> category_count<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_products<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token number">100.0</span> <span class="token operator">*</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token keyword">PARTITION</span> <span class="token keyword">BY</span> category<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> percentage <span class="token keyword">FROM</span> products <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> percentage <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Part 9: Advanced COUNT Techniques
1. Counting with Multiple Conditions
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment">-- Count customers by activity and tier</span> <span class="token keyword">SELECT</span> loyalty_tier<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> is_active<span class="token punctuation">)</span> <span class="token keyword">AS</span> active<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token operator">NOT</span> is_active<span class="token punctuation">)</span> <span class="token keyword">AS</span> inactive<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token number">100.0</span> <span class="token operator">*</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> is_active<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> active_percentage <span class="token keyword">FROM</span> customers <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> loyalty_tier <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> loyalty_tier<span class="token punctuation">;</span> |
2. Counting Missing Data
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Data quality check: count missing values across columns</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_rows<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span> <span class="token keyword">AS</span> email_present<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> email <span class="token operator">IS</span> <span class="token boolean">NULL</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> email_missing<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> first_name <span class="token operator">IS</span> <span class="token boolean">NULL</span> <span class="token operator">OR</span> last_name <span class="token operator">IS</span> <span class="token boolean">NULL</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> name_missing<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>loyalty_tier<span class="token punctuation">)</span> <span class="token keyword">AS</span> tier_present <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
3. Rolling Counts Over Time
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment">-- Cumulative customer signups by month</span> <span class="token keyword">WITH</span> monthly_signups <span class="token keyword">AS</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> DATE_TRUNC<span class="token punctuation">(</span><span class="token string">'month'</span><span class="token punctuation">,</span> signup_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> <span class="token keyword">month</span><span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> signups <span class="token keyword">FROM</span> customers <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> DATE_TRUNC<span class="token punctuation">(</span><span class="token string">'month'</span><span class="token punctuation">,</span> signup_date<span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">SELECT</span> <span class="token keyword">month</span><span class="token punctuation">,</span> signups<span class="token punctuation">,</span> <span class="token function">SUM</span><span class="token punctuation">(</span>signups<span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token keyword">ORDER</span> <span class="token keyword">BY</span> <span class="token keyword">month</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_customers <span class="token keyword">FROM</span> monthly_signups <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> <span class="token keyword">month</span><span class="token punctuation">;</span> |
4. Count with CUBE and ROLLUP
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Multiple levels of grouping with ROLLUP</span> <span class="token keyword">SELECT</span> <span class="token keyword">COALESCE</span><span class="token punctuation">(</span>city<span class="token punctuation">,</span> <span class="token string">'All Cities'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> city<span class="token punctuation">,</span> <span class="token keyword">COALESCE</span><span class="token punctuation">(</span>loyalty_tier<span class="token punctuation">,</span> <span class="token string">'All Tiers'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> tier<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> customer_count <span class="token keyword">FROM</span> customers <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> ROLLUP<span class="token punctuation">(</span>city<span class="token punctuation">,</span> loyalty_tier<span class="token punctuation">)</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> city<span class="token punctuation">,</span> tier<span class="token punctuation">;</span> |
Part 10: Real-World Examples
Example 1: Executive Dashboard
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="token keyword">WITH</span> dashboard_metrics <span class="token keyword">AS</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token comment">-- Customer metrics</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> customers<span class="token punctuation">)</span> <span class="token keyword">AS</span> total_customers<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> customers <span class="token keyword">WHERE</span> is_active<span class="token punctuation">)</span> <span class="token keyword">AS</span> active_customers<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> customers <span class="token keyword">WHERE</span> signup_date <span class="token operator">></span> <span class="token keyword">CURRENT_DATE</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'30 days'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> new_customers_30d<span class="token punctuation">,</span> <span class="token comment">-- Order metrics</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders<span class="token punctuation">)</span> <span class="token keyword">AS</span> total_orders<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders <span class="token keyword">WHERE</span> order_date <span class="token operator">></span> <span class="token keyword">CURRENT_DATE</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'30 days'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> orders_30d<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">SUM</span><span class="token punctuation">(</span>total_amount<span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders <span class="token keyword">WHERE</span> order_date <span class="token operator">></span> <span class="token keyword">CURRENT_DATE</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'30 days'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> revenue_30d<span class="token punctuation">,</span> <span class="token comment">-- Product metrics</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> <span class="token operator">NOT</span> is_discontinued<span class="token punctuation">)</span> <span class="token keyword">AS</span> active_products<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> stock_quantity <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> low_stock_products<span class="token punctuation">,</span> <span class="token comment">-- Review metrics</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> reviews <span class="token keyword">WHERE</span> review_date <span class="token operator">></span> <span class="token keyword">CURRENT_DATE</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'30 days'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> reviews_30d<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token function">AVG</span><span class="token punctuation">(</span>rating<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> reviews<span class="token punctuation">)</span> <span class="token keyword">AS</span> avg_rating <span class="token punctuation">)</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> dashboard_metrics<span class="token punctuation">;</span> |
Example 2: Customer Segmentation
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<span class="token comment">-- Segment customers based on order history</span> <span class="token keyword">WITH</span> customer_stats <span class="token keyword">AS</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> c<span class="token punctuation">.</span>customer_id<span class="token punctuation">,</span> c<span class="token punctuation">.</span>first_name<span class="token punctuation">,</span> c<span class="token punctuation">.</span>last_name<span class="token punctuation">,</span> c<span class="token punctuation">.</span>loyalty_tier<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> order_count<span class="token punctuation">,</span> <span class="token keyword">COALESCE</span><span class="token punctuation">(</span><span class="token function">SUM</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>total_amount<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_spent<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> last_order_date <span class="token keyword">FROM</span> customers c <span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> orders o <span class="token keyword">ON</span> c<span class="token punctuation">.</span>customer_id <span class="token operator">=</span> o<span class="token punctuation">.</span>customer_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> c<span class="token punctuation">.</span>customer_id<span class="token punctuation">,</span> c<span class="token punctuation">.</span>first_name<span class="token punctuation">,</span> c<span class="token punctuation">.</span>last_name<span class="token punctuation">,</span> c<span class="token punctuation">.</span>loyalty_tier <span class="token punctuation">)</span> <span class="token keyword">SELECT</span> <span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> order_count <span class="token operator">=</span> <span class="token number">0</span> <span class="token keyword">THEN</span> <span class="token string">'Never Ordered'</span> <span class="token keyword">WHEN</span> last_order_date <span class="token operator"><</span> <span class="token keyword">CURRENT_DATE</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'90 days'</span> <span class="token keyword">THEN</span> <span class="token string">'Churned'</span> <span class="token keyword">WHEN</span> order_count <span class="token operator">>=</span> <span class="token number">5</span> <span class="token operator">AND</span> total_spent <span class="token operator">></span> <span class="token number">1000</span> <span class="token keyword">THEN</span> <span class="token string">'VIP'</span> <span class="token keyword">WHEN</span> order_count <span class="token operator">>=</span> <span class="token number">3</span> <span class="token keyword">THEN</span> <span class="token string">'Regular'</span> <span class="token keyword">ELSE</span> <span class="token string">'Occasional'</span> <span class="token keyword">END</span> <span class="token keyword">AS</span> segment<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> customer_count<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token number">100.0</span> <span class="token operator">*</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token function">SUM</span><span class="token punctuation">(</span><span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> percentage<span class="token punctuation">,</span> <span class="token function">SUM</span><span class="token punctuation">(</span>total_spent<span class="token punctuation">)</span> <span class="token keyword">AS</span> segment_revenue <span class="token keyword">FROM</span> customer_stats <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> segment <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> segment_revenue <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Example 3: Inventory Analysis
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="token comment">-- Inventory health check by category</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_products<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> stock_quantity <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> out_of_stock<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> stock_quantity <span class="token operator">BETWEEN</span> <span class="token number">1</span> <span class="token operator">AND</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> low_stock<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> stock_quantity <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> well_stocked<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> is_discontinued<span class="token punctuation">)</span> <span class="token keyword">AS</span> discontinued<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token number">100.0</span> <span class="token operator">*</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> stock_quantity <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> out_of_stock_pct <span class="token keyword">FROM</span> products <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> out_of_stock_pct <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Example 4: Order Fulfillment Analysis
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- Order processing metrics by day of week</span> <span class="token keyword">SELECT</span> EXTRACT<span class="token punctuation">(</span>DOW <span class="token keyword">FROM</span> order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> day_of_week<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_orders<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> delivered<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'shipped'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> shipped<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'pending'</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> pending<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token function">AVG</span><span class="token punctuation">(</span>EXTRACT<span class="token punctuation">(</span>EPOCH <span class="token keyword">FROM</span> <span class="token punctuation">(</span><span class="token keyword">CURRENT_TIMESTAMP</span> <span class="token operator">-</span> order_date<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">3600</span><span class="token punctuation">)</span>::<span class="token keyword">numeric</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> avg_age_hours <span class="token keyword">FROM</span> orders <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> day_of_week <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> day_of_week<span class="token punctuation">;</span> |
Example 5: Review Analysis
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment">-- Product review statistics</span> <span class="token keyword">SELECT</span> p<span class="token punctuation">.</span>category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> products<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>review_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> total_reviews<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> r<span class="token punctuation">.</span>customer_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> reviewers<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> r<span class="token punctuation">.</span>rating <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> five_star<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> FILTER <span class="token punctuation">(</span><span class="token keyword">WHERE</span> r<span class="token punctuation">.</span>rating <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> one_star<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token number">100.0</span> <span class="token operator">*</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>review_id<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> reviews_per_product<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token function">AVG</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>rating<span class="token punctuation">)</span>::<span class="token keyword">numeric</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> avg_rating <span class="token keyword">FROM</span> products p <span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> reviews r <span class="token keyword">ON</span> p<span class="token punctuation">.</span>product_id <span class="token operator">=</span> r<span class="token punctuation">.</span>product_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> p<span class="token punctuation">.</span>category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> avg_rating <span class="token keyword">DESC</span> NULLS <span class="token keyword">LAST</span><span class="token punctuation">;</span> |
Part 11: Performance Considerations
1. Indexes for COUNT
Different COUNT queries benefit from different indexes:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="token comment">-- COUNT(*) on entire table - PostgreSQL maintains statistics, but for exact count:</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_customers_any <span class="token keyword">ON</span> customers<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Not needed, just for illustration</span> <span class="token comment">-- COUNT with WHERE clause benefits from index on filtered column</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_orders_status <span class="token keyword">ON</span> orders<span class="token punctuation">(</span><span class="token keyword">status</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_orders_order_date <span class="token keyword">ON</span> orders<span class="token punctuation">(</span>order_date<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- COUNT with GROUP BY benefits from index on group column</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_products_category <span class="token keyword">ON</span> products<span class="token punctuation">(</span>category<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- COUNT(DISTINCT) benefits from index on the column</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_customers_city <span class="token keyword">ON</span> customers<span class="token punctuation">(</span>city<span class="token punctuation">)</span><span class="token punctuation">;</span> |
2. Understanding COUNT Performance
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- Very fast - uses statistics</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> large_table<span class="token punctuation">;</span> <span class="token comment">-- Fast with index</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders <span class="token keyword">WHERE</span> <span class="token keyword">status</span> <span class="token operator">=</span> <span class="token string">'delivered'</span><span class="token punctuation">;</span> <span class="token comment">-- Can be slower - needs to read all rows</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>review_text<span class="token punctuation">)</span> <span class="token keyword">FROM</span> reviews <span class="token keyword">WHERE</span> review_text <span class="token operator">LIKE</span> <span class="token string">'%good%'</span><span class="token punctuation">;</span> <span class="token comment">-- Slower for large distinct counts</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> customer_id<span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders<span class="token punctuation">;</span> |
3. Approximate Counts for Large Tables
For very large tables, exact counts can be slow:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Get approximate row count from statistics (very fast, not exact)</span> <span class="token keyword">SELECT</span> reltuples <span class="token keyword">AS</span> approximate_row_count <span class="token keyword">FROM</span> pg_class <span class="token keyword">WHERE</span> relname <span class="token operator">=</span> <span class="token string">'orders'</span><span class="token punctuation">;</span> <span class="token comment">-- Exact but potentially slow for huge tables</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders<span class="token punctuation">;</span> |
Part 12: Common Mistakes and How to Avoid Them
Mistake 1: COUNT(*) vs COUNT(column) Confusion
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- ❌ These can give different results if column has NULLs</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span> <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> <span class="token comment">-- ✅ Be explicit about what you want</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_rows<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span> <span class="token keyword">AS</span> non_null_emails<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span> <span class="token keyword">AS</span> null_emails <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
Mistake 2: Forgetting that COUNT(DISTINCT) ignores NULLs
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- ❌ This might be lower than expected if many NULLs</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> email<span class="token punctuation">)</span> <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> <span class="token comment">-- ✅ If you want to count NULL as a distinct value</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> <span class="token keyword">COALESCE</span><span class="token punctuation">(</span>email<span class="token punctuation">,</span> <span class="token string">'NULL_VALUE'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> customers<span class="token punctuation">;</span> |
Mistake 3: Using COUNT in WHERE instead of HAVING
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- ❌ This doesn't work - aggregate functions can't be in WHERE</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">5</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category<span class="token punctuation">;</span> <span class="token comment">-- ✅ Use HAVING instead</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> products <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">5</span><span class="token punctuation">;</span> |
Mistake 4: Not Handling NULLs in Conditional Counts
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment">-- ❌ This doesn't count NULL ratings properly</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> rating <span class="token operator">>=</span> <span class="token number">4</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> reviews<span class="token punctuation">;</span> <span class="token comment">-- ✅ This is safer</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> rating <span class="token operator">>=</span> <span class="token number">4</span> <span class="token keyword">THEN</span> <span class="token number">1</span> <span class="token keyword">END</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> reviews<span class="token punctuation">;</span> <span class="token comment">-- Actually, it's fine - NULL ratings won't satisfy the condition anyway</span> |
Mistake 5: Counting Without Considering Joins
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- ❌ This might double-count if there are multiple items per order</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders o <span class="token keyword">JOIN</span> order_items oi <span class="token keyword">ON</span> o<span class="token punctuation">.</span>order_id <span class="token operator">=</span> oi<span class="token punctuation">.</span>order_id<span class="token punctuation">;</span> <span class="token comment">-- ✅ Count distinct orders instead</span> <span class="token keyword">SELECT</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> o<span class="token punctuation">.</span>order_id<span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders o <span class="token keyword">JOIN</span> order_items oi <span class="token keyword">ON</span> o<span class="token punctuation">.</span>order_id <span class="token operator">=</span> oi<span class="token punctuation">.</span>order_id<span class="token punctuation">;</span> |
Summary: The COUNT Philosophy
The COUNT function is your fundamental tool for understanding volume and quantity in your database:
-
COUNT(*) – “How many rows are there?”
-
COUNT(column) – “How many non-NULL values in this column?”
-
COUNT(DISTINCT) – “How many unique values exist?”
Master these patterns:
-
Simple totals with COUNT(*)
-
Conditional counts with FILTER or CASE
-
Grouped counts with GROUP BY
-
Filtered groups with HAVING
-
Running counts with window functions
-
Data quality checks with COUNT and NULL handling
Remember:
-
COUNT(*) includes everything, NULLs included
-
COUNT(column) excludes NULLs
-
COUNT(DISTINCT) counts unique non-NULL values
-
Indexes can dramatically speed up COUNT queries
-
For very large tables, consider approximate counts
Key applications:
-
Business metrics (“How many customers signed up this month?”)
-
Inventory management (“How many products are low in stock?”)
-
Quality control (“How many missing email addresses?”)
-
Customer analysis (“How many orders per customer?”)
-
Performance monitoring (“How many orders are pending?”)
The COUNT function transforms raw data into actionable business intelligence. It answers the most fundamental question in data analysis: “How many?” Master COUNT, and you’ll always know the size and shape of your data landscape.
Would you like me to elaborate on any specific aspect of COUNT, such as more complex counting scenarios, performance optimization for large tables, or integration with other aggregate functions?
