<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Patrick Deschere</title>
    <description>The latest articles on DEV Community by Patrick Deschere (@p_desch).</description>
    <link>https://dev.to/p_desch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1983444%2F3bab1298-0f73-48f9-aba2-8f1de285d9b1.jpg</url>
      <title>DEV Community: Patrick Deschere</title>
      <link>https://dev.to/p_desch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/p_desch"/>
    <language>en</language>
    <item>
      <title>Protect the dogs from AI</title>
      <dc:creator>Patrick Deschere</dc:creator>
      <pubDate>Tue, 24 Sep 2024 18:26:59 +0000</pubDate>
      <link>https://dev.to/p_desch/protect-the-dogs-from-ai-m5h</link>
      <guid>https://dev.to/p_desch/protect-the-dogs-from-ai-m5h</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdc54fm0tor8b8n7jbtgr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdc54fm0tor8b8n7jbtgr.png" alt="Image description" width="642" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>memes</category>
      <category>python</category>
    </item>
    <item>
      <title>Cleaning up personal expense data with SQL</title>
      <dc:creator>Patrick Deschere</dc:creator>
      <pubDate>Thu, 19 Sep 2024 22:42:05 +0000</pubDate>
      <link>https://dev.to/p_desch/my-first-sql-project-personal-expenses-analysis-3153</link>
      <guid>https://dev.to/p_desch/my-first-sql-project-personal-expenses-analysis-3153</guid>
      <description>&lt;p&gt;&lt;em&gt;In this post, I share my experience practicing SQL by cleaning up data related to personal expense transactions, cleaning the data again (and again), and then finally performing a bit of analysis. I'm still a beginner and hope this article might be interesting to other newbies like myself.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also! For the sake of writing this post and maintaining a bit of privacy, I made a "demo" copy of my expenses which includes modified dollar amounts and business names. That said... I did not attempt to hide any of my numerous fried chicken purchases&lt;/em&gt; 🙈&lt;/p&gt;

&lt;h2&gt;
  
  
  Goal: Practice SQL with data relevant to my life
&lt;/h2&gt;

&lt;p&gt;Earlier this year, I completed an introductory SQL course that included a lot of exercises related to analyzing ye olde Olympics, Netflix, and FIFA databases. Afterward, I was hungry to continue practicing SQL, but with a set of data more personal and relevant to my life. &lt;/p&gt;

&lt;p&gt;Like many people, I routinely spend money on stuff. My previous system for tracking expenses included a horrible Microsoft Excel sheet and too much time spent normalizing data. So I decided to see if SQL would be a better for cleaning, summarizing, and getting insights about my personal expenses. &lt;/p&gt;

&lt;p&gt;Plus, I would be able to answer some truly important questions, like, "Which takeout restaurant do I get most frequently?" and "Do I have a fried chicken addiction?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: Table design and creation
&lt;/h2&gt;

&lt;p&gt;The first step was reviewing the available data, understanding my goals, and designing a table schema to support those goals. &lt;/p&gt;

&lt;h3&gt;
  
  
  Bank and credit card data
&lt;/h3&gt;

&lt;p&gt;I downloaded a few CSV files containing bank account and credit card transactions spanning the past two years. These files contained some useful information related to each transaction: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transaction date &lt;/li&gt;
&lt;li&gt;Amount &lt;/li&gt;
&lt;li&gt;Description (e.g., &lt;em&gt;TST* Fried Chicken Restaurant LLC&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Type (e.g., &lt;em&gt;Credit&lt;/em&gt;, &lt;em&gt;Debit&lt;/em&gt;, &lt;em&gt;Sale&lt;/em&gt;, &lt;em&gt;Return&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Category (e.g., &lt;em&gt;Shopping&lt;/em&gt;, &lt;em&gt;Groceries&lt;/em&gt;, &lt;em&gt;Travel&lt;/em&gt;) automatically assigned by the credit card company. This column didn't exist in the files from the bank account. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Table schema planning
&lt;/h3&gt;

&lt;p&gt;Before writing any code, I spent some time thinking about my goals and how I would use the database in the future:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short-term goal: Summarize spending by category, time period (e.g., year, quarter, month), and understand month "fixed" or "essential" spending. &lt;/li&gt;
&lt;li&gt;Long-term goal: If this project were approved by my wife (a business analyst herself), I might import her expenses into the system and understand how we're sharing household expenses.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Theoretically, these goals could be accomplished with one table. However, in order to retain flexibility (and avoiding bulk revising data later), I included two tables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; --------------------------------         ----------------------------
| transactions     |             |       | accounts     |             |
| ---------------- | ----------- |       | ------------ | ----------- |
| transaction_id   | primary key |   |‾‾‾| account_id   | primary key | 
| transaction_date |             |   |   | account_name |             |
| account_id       | foreign key |‾‾‾    | account_type |             |
| description      |             |       | institution  |             |
| category         |             |       | owner        |             |
| type             |             |        ----------------------------
| amount           |             |      
 --------------------------------        
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;transactions&lt;/code&gt; table would store individual records for each incoming and outgoing transaction belonging to all bank and credit card accounts. The second table &lt;code&gt;accounts&lt;/code&gt; would store extra information about each account (and perhaps someday would be used to know which expenses belong to accounts owned by me or my wife).&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the tables!
&lt;/h3&gt;

&lt;p&gt;You can see more details about the tables and fields by referencing the below code. For a newbie like me, the most exciting part was using &lt;code&gt;DECIMAL(10,2)&lt;/code&gt; for the &lt;code&gt;amount&lt;/code&gt; field, which would accommodate dollar and cent amounts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;CREATE&lt;/span&gt; &lt;span class="kr"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;account_id&lt;/span&gt; &lt;span class="kt"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;
    &lt;span class="n"&gt;account_name&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
    &lt;span class="n"&gt;account_type&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
    &lt;span class="n"&gt;institution&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
    &lt;span class="k"&gt;owner&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kr"&gt;CREATE&lt;/span&gt; &lt;span class="kr"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;transaction_id&lt;/span&gt; &lt;span class="k"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kt"&gt;DATE&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;account_id&lt;/span&gt; &lt;span class="kt"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
    &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="kr"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cleaning data without modifying the data
&lt;/h2&gt;

&lt;p&gt;After creating the tables and importing about 1,500 transactions, I performed a simple query to review the data and get a sense of potential issues to fix.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction_date | description                                | category          | type    |   amount   
---------------- | ------------------------------------------ | ----------------- | ------- | -------- 
2024-07-31       | Uniqlo USA LLC                             | Shopping          | Sale    |  -101.08 
2024-07-31       | ETERNAL HOME LOANS   0000000000  WEB ID... | NULL              | DEBIT   | -2348.33 
2024-07-31       | GOOGLE *FI DH0TCM                          | Bills &amp;amp; Utilities | Sale    |  -103.39 
2024-07-30       | Credit Card Payment - Thank You            | NULL              | Payment |  1972.01 
2024-07-30       | PAYMENT TO EMPIRE BANK CARD ENDING IN 0... | NULL              | DEBIT   | -1972.01 
2024-07-30       | TTP* LOVELY DOGGO WALKO                    | Personal          | Sale    |   -20.80 
2024-07-29       | GOOGLE *Peacock                            | Shopping          | Sale    |   -12.35 
2024-07-29       | NEIGHBORS GROCERY OUT                      | Groceries         | Sale    |   -31.57 
2024-07-29       | AMC 0000 ONLINE                            | Entertainment     | Sale    |   -39.78 
2024-07-26       | TAQUERIA EL                                | Food &amp;amp; Drink      | Sale    |   -24.89 
2024-07-25       | SQ *JACK STRANDS SALON                     | Personal          | Sale    |   -56.64 
2024-07-25       | GREYHOUND VETERINARY H                     | Personal          | Sale    |   -87.19 
2024-07-24       | B&amp;amp;amp;H PHOTO 000-000-0000                 | Shopping          | Sale    |   -70.58 
2024-07-24       | EVIL INTERNET &amp;amp; CABLE CORP                 | Bills &amp;amp; Utilities | Sale    |   -77.25 
...              | ...                                        | ...               | ...     |      ... 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you see, the data required cleaning and standardization before it would be useful for analysis. Here are a few issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;description&lt;/code&gt; column contained inconsistent formats, extra characters (e.g., strings of text related to payment processing services, random invoice numbers), and sometimes the same business appeared differently. &lt;/li&gt;
&lt;li&gt;There were &lt;code&gt;NULL&lt;/code&gt; values in the &lt;code&gt;category&lt;/code&gt; field for all bank transactions, because the bank account didn't automatically assign a category like the credit cards accounts did. &lt;/li&gt;
&lt;li&gt;Also, while the &lt;code&gt;category&lt;/code&gt; field was mostly correct, some transactions required a category different from the one assigned by the credit card. For example, I would rather assign dog food, vet bills, and dog walker fees to a new &lt;code&gt;Dog&lt;/code&gt; expense category.&lt;/li&gt;
&lt;li&gt;The data in the &lt;code&gt;type&lt;/code&gt; column wasn't necessarily wrong, but I felt it would benefit from some consolidation.&lt;/li&gt;
&lt;li&gt;There were a lot of transactions that would need to be ignored when summarizing spending habits. For example, transfers between my checking account and savings accounts, transfers to investment accounts, regular credit card payments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since I was still exploring the data and wasn't sure how I would use them in the future, I wanted to fix the above issues without modifying the data itself.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Consolidating transaction types
&lt;/h2&gt;

&lt;p&gt;The default transaction types were not very intuitive, so I decided to consolidate them into three categories. &lt;/p&gt;

&lt;p&gt;Here are the default types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt; &lt;span class="kr"&gt;DISTINCT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type
----------
CREDIT  
Payment     
Adjustment  
CHECK           
DSLIP
Sale
Return
Fee
DEBIT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wrote the below &lt;code&gt;CASE&lt;/code&gt; clause to consolidate them into three types: &lt;code&gt;In&lt;/code&gt;, &lt;code&gt;Out&lt;/code&gt;, and &lt;code&gt;Return&lt;/code&gt;. Technically, returned purchases could be grouped with the other incoming transactions, but for now I wanted an easy to separate them -- just case I wanted to filter say salaries and other income but keep returned purchases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Adjustment|CREDIT|DSLIP&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;In&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHECK|DEBIT|Fee|Payment|Sale&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Out&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Below are the results with the new &lt;code&gt;clean_type&lt;/code&gt; added.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CASE&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Adjustment|CREDIT|DSLIP&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;In&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHECK|DEBIT|Fee|Payment|Sale&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Out&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_type&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clean_transactions&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;description                          | type   | clean_type
------------------------------------ | ------ | ----------
TTP* LOVELY DOGGO WALKO              | Sale   | Out
BUZZ N WOODY PIZZA                   | Sale   | Out
REGIONAL LANDMARK ENERGY INC         | Sale   | Out
TST*LUCKY BREWING - CAP              | Sale   | Out
ROBBER BARON INVESTMENTS PPD ID: ... | DEBIT  | Out
TTP* LOVELY DOGGO WALKO              | Sale   | Out
GREYHOUND VETERINARY H               | Sale   | Out
NEW TECH NORTHWEST                   | Sale   | Out
REMOTE ONLINE DEPOSIT #              | DSLIP  | In
TST* DIN TAI FUNG - BELLE            | Sale   | Out
ETERNAL HOME LOANS   0000000000      | DEBIT  | Out
GOOGLE *FI DH0TCM                    | Sale   | Out
WALLSTREET BROS SAVINGS: 0000000000  | CREDIT | In
...                                  | ...    | ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fixing incorrect and NULL categories
&lt;/h2&gt;

&lt;p&gt;Next on the list was cleaning up the &lt;code&gt;NULL&lt;/code&gt; values and wrong categories in the &lt;code&gt;category&lt;/code&gt; field. To get a sense of the categories, here are the distinct values assigned by my credit cards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt; &lt;span class="kr"&gt;DISTINCT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;category&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;category
---------------------
Automotive
Bills &amp;amp; Utilities
Education
Entertainment
Fees &amp;amp; Adjustments
Food &amp;amp; Drink
Gas
Gifts &amp;amp; Donations
Groceries
Health &amp;amp; Wellness
Home
Personal
Professional Services
Shopping
Travel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Identifying records with &lt;code&gt;NULL&lt;/code&gt; values was simple, but figuring out which transactions would need a different category took a little more time. For those records, I prioritized identifying which recurring transactions needed attention. To do so, I used the below query. &lt;/p&gt;

&lt;p&gt;Some vendor names in the &lt;code&gt;description&lt;/code&gt; field were not consistent. For example, my mortgage servicing company appeared as &lt;code&gt;ETERNAL HOME LOANS  000...&lt;/code&gt; in some places, but also appeared as &lt;code&gt;ETERNAL HOME LOANS PAYMENTS   000...&lt;/code&gt; in some places. In order to group similar descriptions like these, I used the &lt;code&gt;LEFT&lt;/code&gt; function to only return the first 14 characters of each description.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt; 
    &lt;span class="nf"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;short_description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;category&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="kr"&gt;GROUP&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;short_description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="nf"&gt;count&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;count | short_description | category
----- | ------------------| --------
83    | TTP* LOVELY DO    | Personal
43    | PAYMENT TO EMP    | NULL
39    | COSTCO WHSE #0    | Shopping
33    | WALLSTREET BRO    | NULL
31    | CHEWY.COM         | Shopping
29    | NEIGHBORS GROC    | Groceries
27    | APPLE.COM/BILL    | Shopping
26    | ROXY'S FRIED C    | Food &amp;amp; Drink
25    | BUZZ N WOODY P    | Food &amp;amp; Drink
24    | ETERNAL HOME L    | NULL
23    | EVIL INTERNET     | Bills &amp;amp; Utilities
23    | REGIONAL LANDM    | Bills &amp;amp; Utilities
20    | SQ *NEXT DOOR     | Food &amp;amp; Drink
19    | COSTCO GAS #00    | Gas
19    | COOKUNITY INC     | Groceries
15    | SQ *JACK STRAN    | Personal
14    | MCDONALD'S F00    | Food &amp;amp; Drink
14    | GREYHOUND VETE    | Personal
14    | INVESTCORP  BU    | NULL
13    | AVG PARKING 00    | Travel
...   | ...               | ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After investigating, I compiled a list of issues. Here are a couple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As mentioned previously, transactions associated with my bank account were all &lt;code&gt;NULL&lt;/code&gt; and would need a new category assigned. For example, there were 24 transfers to my mortgage servicing company &lt;code&gt;ETERNAL HOME LOANS&lt;/code&gt; where the category should be changed from &lt;code&gt;NULL&lt;/code&gt; to &lt;code&gt;Mortgage&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;There were 39 transactions to &lt;code&gt;COSTCO WHSE&lt;/code&gt; assigned to &lt;code&gt;Shopping&lt;/code&gt;. I wanted to change these to &lt;code&gt;Groceries&lt;/code&gt; since the vast majority of my purchases at Costco are food and groceries. &lt;/li&gt;
&lt;li&gt;Also noted earlier, there were many transactions related to dog ownership, but they were assigned different categories like &lt;code&gt;Personal&lt;/code&gt; and &lt;code&gt;Shopping&lt;/code&gt;. I wanted to replace the automatically assigned categories with a new &lt;code&gt;Dog&lt;/code&gt; category. &lt;/li&gt;
&lt;li&gt;I wanted to consolidate &lt;code&gt;Automative&lt;/code&gt; and &lt;code&gt;Gas&lt;/code&gt; into one category &lt;code&gt;Automative &amp;amp; Gas&lt;/code&gt;, so it would be easier to group expenses related to owning and driving my car. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since there wasn't a huge number of recurring vendors and services, I decided the easiest solution would be to use another &lt;code&gt;CASE&lt;/code&gt; clause. For example, if the description contained &lt;code&gt;CHEWY.COM&lt;/code&gt;, &lt;code&gt;GREYHOUND VETERINARY&lt;/code&gt;, or &lt;code&gt;LOVELY DOGGO WALKO&lt;/code&gt;, then the category would be replaced with &lt;code&gt;Dog&lt;/code&gt;.  &lt;/p&gt;

&lt;p&gt;After reviewing the most frequently recurring descriptions, I identified several patterns to include in the below &lt;code&gt;CASE&lt;/code&gt; statement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DRIVER LICENSE RENEW|VEHICLE LICENSING|INSUROTRON|PARKING|SPOTHERO|PAYBYPHONE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Gas|Automotive&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Automotive &amp;amp; Gas&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^PAYMENT TO EMPIRE|Credit Card Payment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Credit card&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^REDEMPTION CREDIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Points cashback&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOVELY DOGGO|GREYHOUND VETERINARY|LOCAL HOUND GROOMER|CHEWY.COM|WHO LET THE PETS OUT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAYSTATION|NBA League|NETFLIX|YouTube|NVIDIA|APPLE.COM/BILL|GOOGLE &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;Peacock&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Entertainment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;COSTCO WHSE|INSTACART&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Groceries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TRVL CARD BANK|PARKSRESERVATIONSWEB|TRUSTEDTRAVELER&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Travel&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM WITHDRAWAL|FOREIGN EXCHANGE RATE|NON-EMPIRE BANK ATM|^CHECK #&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Misc&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^ETERNAL HOME LOANS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mortgage&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^DEPOSIT  ID NUMBER|^IRS.*TAX REF&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Other income&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC ACH PMT|^VENMO|^Zelle|^REMOTE ONLINE DEPOSIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Reimbursement&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^WALLSTREET BROS|^INVESTCORP|ROBBER BARON INVESTM|APA.*TREAS|^Online Transfer&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Saving &amp;amp; Investing&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC PAYROLL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wages &amp;amp; Salaries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;             
    &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After dropping this into my query from last time...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CASE&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Adjustment|Return&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Returns &amp;amp; Cashback&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CREDIT|DSLIP&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Income &amp;amp; Deposits&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHECK|DEBIT|Fee|Payment|Sale&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payments &amp;amp; Transfers&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CASE&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DRIVER LICENSE RENEW|VEHICLE LICENSING|INSUROTRON|PARKING|SPOTHERO|PAYBYPHONE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Gas|Automotive&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Automotive &amp;amp; Gas&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^PAYMENT TO EMPIRE|Credit Card Payment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Credit card&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^REDEMPTION CREDIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Points cashback&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOVELY DOGGO|GREYHOUND VETERINARY|LOCAL HOUND GROOMER|CHEWY.COM|WHO LET THE PETS OUT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAYSTATION|NBA League|NETFLIX|YouTube|NVIDIA|APPLE.COM/BILL|GOOGLE &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;Peacock&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Entertainment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;COSTCO WHSE|INSTACART&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Groceries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TRVL CARD BANK|PARKSRESERVATIONSWEB|TRUSTEDTRAVELER&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Travel&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM WITHDRAWAL|FOREIGN EXCHANGE RATE|NON-EMPIRE BANK ATM|^CHECK #&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Misc&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^ETERNAL HOME LOANS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mortgage&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^DEPOSIT  ID NUMBER|^IRS.*TAX REF&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Other income&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC ACH PMT|^VENMO|^Zelle|^REMOTE ONLINE DEPOSIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Reimbursement&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^WALLSTREET BROS|^INVESTCORP|ROBBER BARON INVESTM|APA.*TREAS|^Online Transfer&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Saving &amp;amp; Investing&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC PAYROLL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wages &amp;amp; Salaries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;             
    &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2024-08-06&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
&lt;span class="ow"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NEW TECH NORTHWEST&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...I got the below example of the &lt;code&gt;clean_category&lt;/code&gt; column.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;description                               | category          | clean_category
----------------------------------------- | ----------------- | ---------------
ROBBER BARON INVESTMENTS PPD ID: 00000... | NULL              | Saving &amp;amp; Investing
GREYHOUND VETERINARY H                    | Personal          | Dog
TTP* LOVELY DOGGO WALKO                   | Personal          | Dog
REMOTE ONLINE DEPOSIT #          0        | NULL              | Reimbursement
TST* DIN TAI FUNG - BELLE                 | Food &amp;amp; Drink      | Food &amp;amp; Drink
Uniqlo USA LLC                            | Shopping          | Shopping
ETERNAL HOME LOANS   0000000000      W... | NULL              | Mortgage
GOOGLE *FI DH0TCM                         | Bills &amp;amp; Utilities | Bills &amp;amp; Utilities
TTP* LOVELY DOGGO WALKO                   | Personal          | Dog
Credit Card Payment - Thank You           | NULL              | Credit card
PAYMENT TO EMPIRE BANK CARD ENDING IN ... | NULL              | Credit card
GOOGLE *Peacock                           | Shopping          | Entertainment
AMC 0000 ONLINE                           | Entertainment     | Entertainment
NEIGHBORS GROCERY OUT                     | Groceries         | Groceries
WALLSTREET BROS SAVINGS: 0000000000       | NULL              | Saving &amp;amp; Investing
TAQUERIA EL                               | Food &amp;amp; Drink      | Food &amp;amp; Drink
GREYHOUND VETERINARY H                    | Personal          | Dog
SQ *JACK STRANDS SALON                    | Personal          | Personal
FANDANGO                                  | Entertainment     | Entertainment
TRVL CARD BANK  ONLINE PMT CKF00000000... | NULL              | Travel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Removing chaos from the descriptions
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;description&lt;/code&gt; field includes a note about each transaction. For example, it could be the vendor from which I purchased something or the name of a savings account to which I sent money.&lt;/p&gt;

&lt;p&gt;The descriptions had numerous formatting inconsistencies and included extra characters that made it difficult to group them together. For example, each transaction related to Google Fi (my phone service) included a unique invoice code. Take a look below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^Google.+Fi&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction_date | description       
---------------- | ----------------- 
2024-07-31       | GOOGLE *FI DH0TCM 
2024-07-01       | GOOGLE *FI M0zWRQ 
2024-05-31       | GOOGLE *FI 00CNX0 
2024-05-01       | GOOGLE *FI 0GB00X 
2024-03-31       | GOOGLE *FI 0S0HNC 
2024-03-02       | GOOGLE *FI XKW00N 
2024-01-31       | GOOGLE *FI D0J0RZ 
2023-12-31       | GOOGLE *FI G0JRTL 
2023-12-01       | GOOGLE *FI L0CQ00 
2023-10-31       | GOOGLE *FI 0HFBR0 
2023-10-01       | GOOGLE *FI vvRRSB 
2023-08-31       | GOOGLE *FI CV00MN 
2023-07-31       | GOOGLE *FI 00LRXC 
...              | ...               

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I wanted to answer a question like "How much did I spend on phone service last year," standardizing the description to something like &lt;code&gt;Google Fi&lt;/code&gt; would make it easier to group the transactions. &lt;/p&gt;

&lt;p&gt;Next, this is mainly an aesthetic problem, but take a look at dining and takeout transactions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;category&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Food &amp;amp; Drink&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'description'             | 'category'   
------------------------- | ------------ 
MESOPOTAMIA MIX           | Food &amp;amp; Drink 
TST*LUCKY BREWING - CAP   | Food &amp;amp; Drink 
HOLE IN WALL THAI LLC     | Food &amp;amp; Drink 
TST*ROCKET TACO - TOWN    | Food &amp;amp; Drink 
CAFE BRIO                 | Food &amp;amp; Drink 
SQ *RED FISH BLUE FISH    | Food &amp;amp; Drink 
SQ *CRAFT (VICTORIA) LTD. | Food &amp;amp; Drink 
FRIENDS &amp;amp;amp; FAMILY BAKE | Food &amp;amp; Drink 
BUZZ N WOODY PIZZA        | Food &amp;amp; Drink 
TST* DIN TAI FUNG         | Food &amp;amp; Drink 
TAQUERIA EL               | Food &amp;amp; Drink 
TWSP PRK ADAM GOLF RES0   | Food &amp;amp; Drink 
SQ *FATS WINGS AND WAFFLE | Food &amp;amp; Drink 
SQ *BEANFISH              | Food &amp;amp; Drink 
SQ *FATS WINGS AND WAFFLE | Food &amp;amp; Drink 
TST* RETURNER CINEMA      | Food &amp;amp; Drink 
...                       | ...          
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restaurants and many other businesses use payment processing services like Square or Toast, which insert a short string like &lt;code&gt;SQ *&lt;/code&gt; and &lt;code&gt;TST*&lt;/code&gt; at the beginning of each description. I wanted to remove these extra strings (and other characters) to enhance readability of the data.  Like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SQ *RED FISH BLUE FISH&lt;/code&gt; --&amp;gt;  &lt;code&gt;RED FISH BLUE FISH&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ *CRAFT (VICTORIA) LTD.&lt;/code&gt; --&amp;gt; &lt;code&gt;CRAFT VICTORIA&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TST*LUCKY BREWING - CAP&lt;/code&gt; --&amp;gt; &lt;code&gt;LUCKY BREWING - CAP&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next I checked descriptions that included a few special characters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;category&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\#&lt;/span&gt;&lt;span class="s1"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;description                        | category          
---------------------------------- | ----------------- 
00000 - 000 DEXTER JUNO            | Travel            
COSTCO WHSE #0000                  | Shopping          
REMOTE ONLINE DEPOSIT #     000000 | NULL              
GOOGLE *Peacock                    | Shopping          
B\&amp;amp;amp;H PHOTO 000-000-0000        | Shopping          
AMAZON MKTPL*RJ0DG00F0             | Shopping          
LOWES #00000*                      | Home              
COSTCO GAS #0000                   | Gas               

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Based on that query, I wanted to remove extra characters (and numbers) like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;COSTCO WHSE #0000&lt;/code&gt; --&amp;gt; &lt;code&gt;COSTCO WHSE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COSTCO GAS #0000&lt;/code&gt; --&amp;gt; &lt;code&gt;COSTCO GAS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LOWES #00000*&lt;/code&gt; --&amp;gt; &lt;code&gt;LOWES&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And fix special characters like the ampersand in this description:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;B&amp;amp;amp;H PHOTO&lt;/code&gt; --&amp;gt; &lt;code&gt;B&amp;amp;H PHOTO&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, there were many transactions that included a mix of letters, numbers, and special characters at the end of the string. Look at the utter mess below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;description     
--------------------------------------------------------------
ROBBER BARON INVESTMENTS PPD ID: 0000000000
ETERNAL HOME LOANS   0000000000      WEB ID: 0000000000
PAYMENT TO EMPIRE BANK CARD ENDING IN 0000 00/00
WALLSTREET BROS SAVINGS: 0000000000
TRVL CARD BANK  ONLINE PMT CKF000000000POS WEB ID: 0000000000
APA  TREAS 000     MISC PAY                 PPD ID: 0000000000
APA  TREAS 000     MISC PAY                 PPD ID: 0000000000
...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In these situations, I wanted to change something like &lt;code&gt;ETERNAL HOME LOANS   0000000000      WEB ID: 0000000000&lt;/code&gt; to just &lt;code&gt;ETERNAL HOME LOANS&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Regular expressions to the rescue
&lt;/h3&gt;

&lt;p&gt;By exploring the description column and reviewing the most frequently occurring records, I identified several patterns that should be deleted or fixed. From there, I wrote a a series of nested &lt;code&gt;REPLACE&lt;/code&gt; and &lt;code&gt;REGEXP_REPLACE&lt;/code&gt; clauses that would clean up the descriptions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Change first letter to uppercase, rest of string lower case&lt;/span&gt;
&lt;span class="nf"&gt;TRIM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="c1"&gt;-- Fix ampersands (&amp;amp;)&lt;/span&gt;
                    &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="c1"&gt;-- Replace strings of letters and numbers after a special character (as long as it appears after the eighth char)&lt;/span&gt;
                &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(?&amp;lt;!^.{0,8})&lt;/span&gt;&lt;span class="se"&gt;\W\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="c1"&gt;-- Replace certain patterns (e.g., 'TST*'), special characters, unwanted strings(e.g. 'LLC')&lt;/span&gt;
            &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^SP&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3}&lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3} &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{3}&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{2}&lt;/span&gt;&lt;span class="se"&gt;\:\s&lt;/span&gt;&lt;span class="s1"&gt;.|&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;|[^&lt;/span&gt;&lt;span class="se"&gt;\w\s&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;.]|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;Inc&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="c1"&gt;-- Replace single characters hanging at the end of a string (e.g. 'Veterinary H' --&amp;gt; 'Veterinary')&lt;/span&gt;
        &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
    &lt;span class="c1"&gt;-- Change multiple spaces into one space&lt;/span&gt;
    &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_description&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I assume someone with more experience would be able to write a more concise version, but I figured it was good enough for me. Let's take a look...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;TRIM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(?&amp;lt;!^.{0,8})&lt;/span&gt;&lt;span class="se"&gt;\W\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^SP&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3}&lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3} &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{3}&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{2}&lt;/span&gt;&lt;span class="se"&gt;\:\s&lt;/span&gt;&lt;span class="s1"&gt;.|&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;|[^&lt;/span&gt;&lt;span class="se"&gt;\w\s&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;.]|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;Inc&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
        &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_description&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'description'                            | 'clean_description'                   
---------------------------------------- | ------------------------------------- 
TTP* LOVELY DOGGO WALKO                  | Lovely Doggo Walko                    
TST*LUCKY BREWING - CAP                  | Lucky Brewing Cap                     
00000 - 000 DEXTER JUNO                  | Dexter Juno                           
TTP* LOVELY DOGGO WALKO                  | Lovely Doggo Walko                    
EVIL INTERNET &amp;amp; CABLE CORP               | Evil Internet &amp;amp; Cable Corp            
HOLE IN WALL THAI LLC                    | Hole In Wall Thai                     
COSTCO WHSE #0000                        | Costco Whse                           
COAST VICTORIA HOTE &amp;amp;amp;                | Coast Victoria Hote &amp;amp;                 
PY *FRS CLIPPER                          | Frs Clipper                           
CHEWY.COM                                | Chewy.Com                             
SQ *CRAFT (VICTORIA) LTD.                | Craft Victoria                        
IRISH TIMES PUB                          | Irish Times Pub                       
FRIENDS &amp;amp;amp; FAMILY BAKE                | Friends &amp;amp; Family Bake                 
SQ *RED FISH BLUE FISH                   | Red Fish Blue Fish                    
ROBBER BARON INVESTMENTS PPD ID: 0000... | Robber Baron Investments              
TTP* LOVELY DOGGO WALKO                  | Lovely Doggo Walko                    
GREYHOUND VETERINARY H                   | Greyhound Veterinary                  
REMOTE ONLINE DEPOSIT #          0       | Remote Online Deposit                 
ETERNAL HOME LOANS  0000000  WEB ID: ... | Eternal Home Loans                    
GOOGLE *FI DH0TCM                        | Google Fi                             
Uniqlo USA LLC                           | Uniqlo Usa                            
TTP* LOVELY DOGGO WALKO                  | Lovely Doggo Walko                    
PAYMENT TO EMPIRE BANK CARD ENDING IN... | Payment To Empire Bank Card Ending In 
...                                      | ...                                   

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...And it did a pretty GOOD job!!!! &lt;/p&gt;

&lt;p&gt;However, it wasn't perfect. For example, let's look at purchases from Amazon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;description            | clean_description  
---------------------- | ------------------ 
AMAZON MKTPL*RJ0DG00F0 | Amazon Mktpl Rj Dg 
AMZN Mktp US*R00000RQ0 | Amzn Mktp Us R Rq  
AMAZON MKTPL*000GV0A00 | Amazon Mktpl       
AMZN Mktp US*BZ0E00T00 | Amzn Mktp Us Bz E  
Amazon.com             | Amazon.Com         
AMZN Mktp US*DK00L00F0 | Amzn Mktp Us Dk L  
Amazon.com*R00Y00R00   | Amazon.Com R Y     
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For recurring vendors and services, I decided it would be faster to add some specialized rules to the &lt;code&gt;CASE&lt;/code&gt; statement. Back when I was fixing the category field earlier, I already made a list of frequently recurring vendors and patterns in the &lt;code&gt;description&lt;/code&gt; field, so it was pretty easy to create another clause as below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="nf"&gt;TRIM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PAYBYPHONE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PayByPhone Parking&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GOOGLE.*FI&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Google Fi&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOVELY DOGGO WALKO&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lovely Doggo Walko&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAYSTATION&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PlayStation Network&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SOUTHERN CHICKEN AND WAFF&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Southern Chicken And Waffle&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NEIGHBORS GROCERY OUT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Neighbors Grocery Outlet&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AmazonStores|Amazon Fresh&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Amazon Fresh&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;WALLSTREET BROS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wallstreet Bros Savings&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AMZN Mktp|Amazon.com|AMAZON MKTPL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Amazon.com&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM WITHDRAWAL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM Withdrawal&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ETERNAL HOME LOANS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Eternal Home Loans&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AIRBNB&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Airbnb&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LYFT.*RIDE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lyft Ride&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Uniqlo&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Uniqlo&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
    &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(?&amp;lt;!^.{0,8})&lt;/span&gt;&lt;span class="se"&gt;\W\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^SP&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3}&lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3} &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{3}&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{2}&lt;/span&gt;&lt;span class="se"&gt;\:\s&lt;/span&gt;&lt;span class="s1"&gt;.|&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;|[^&lt;/span&gt;&lt;span class="se"&gt;\w\s&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;.]|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;Inc&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
        &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_description&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Move the query to a common table expression
&lt;/h2&gt;

&lt;p&gt;At this point, the new &lt;code&gt;clean_description&lt;/code&gt;, &lt;code&gt;clean_category&lt;/code&gt;, and &lt;code&gt;clean_type&lt;/code&gt; columns fixed most of the inconsistent and missing data. It was time to start summarizing and analyzing my expenses! But first... let's examine one more important step.&lt;/p&gt;

&lt;p&gt;When I tried to filter transactions using a &lt;code&gt;WHERE&lt;/code&gt; clause with the &lt;code&gt;clean_category&lt;/code&gt; field, as you can see below...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CASE&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DRIVER LICENSE RENEW|VEHICLE LICENSING|INSUROTRON|PARKING|SPOTHERO|PAYBYPHONE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Gas|Automotive&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Automotive &amp;amp; Gas&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^PAYMENT TO EMPIRE|Credit Card Payment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Credit card&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^REDEMPTION CREDIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Points cashback&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOVELY DOGGO|GREYHOUND VETERINARY|LOCAL HOUND GROOMER|CHEWY.COM|WHO LET THE PETS OUT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAYSTATION|NBA League|NETFLIX|YouTube|NVIDIA|APPLE.COM/BILL|GOOGLE &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;Peacock&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Entertainment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PHO SUP SHOP|BLING BLING ASIAN MARKET&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Food &amp;amp; Drink&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;COSTCO WHSE|INSTACART&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Groceries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TRVL CARD BANK|PARKSRESERVATIONSWEB|TRUSTEDTRAVELER&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Travel&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM WITHDRAWAL|FOREIGN EXCHANGE RATE|NON-EMPIRE BANK ATM|^CHECK #&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Misc&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^ETERNAL HOME LOANS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mortgage&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^DEPOSIT  ID NUMBER|^IRS.*TAX REF&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Other income&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC ACH PMT|^VENMO|^Zelle|^REMOTE ONLINE DEPOSIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Reimbursement&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^WALLSTREET BROS|^INVESTCORP|ROBBER BARON INVESTM|APA.*TREAS|^Online Transfer&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Saving &amp;amp; Investing&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC PAYROLL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
            &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wages &amp;amp; Salaries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;             
        &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
&lt;span class="c1"&gt;-- Only show results from the Food &amp;amp; Drink category&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Food &amp;amp; Drink&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...I encountered this error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR:  column "clean_category" does not exist
LINE 98: WHERE clean_category = 'Food &amp;amp; Drink'
               ^ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Well, when resolving a query, SQL checks the content in the &lt;code&gt;WHERE&lt;/code&gt; clause before resolving the &lt;code&gt;SELECT&lt;/code&gt; portion of the statement (makes sense because we only want data matching the &lt;code&gt;WHERE&lt;/code&gt; clause to be processed and returned). Since the &lt;code&gt;CASE&lt;/code&gt; clause is processed along with the rest of the &lt;code&gt;SELECT&lt;/code&gt; section, it doesn't exist when &lt;code&gt;WHERE&lt;/code&gt; is resolved.  So my &lt;code&gt;clean_category&lt;/code&gt; column didn't exist when the &lt;code&gt;WHERE&lt;/code&gt; clause was resolved.&lt;/p&gt;

&lt;p&gt;To fix this issue, I moved the query to a CTE (common table expression). That way, my "clean" columns would be stored in something like a temporary table, and I would be able to reference the cleaned data when writing a &lt;code&gt;WHERE&lt;/code&gt; clause. Here is an example of the query after moving it to a CTE.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;WITH&lt;/span&gt; 
    &lt;span class="c1"&gt;-- Common table expression (CTE) containing my cleaned data &lt;/span&gt;
    &lt;span class="n"&gt;clean_transactions&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kr"&gt;SELECT&lt;/span&gt;
            &lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;-- Replace common descriptions and remove extra characters and symbols&lt;/span&gt;
            &lt;span class="nf"&gt;TRIM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PAYBYPHONE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PayByPhone Parking&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GOOGLE.*FI&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Google Fi&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOVELY DOGGO WALKO&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lovely Doggo Walko&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAYSTATION&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PlayStation Network&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SOUTHERN CHICKEN AND WAFF&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Southern Chicken And Waffle&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NEIGHBORS GROCERY OUT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Neighbors Grocery Outlet&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AmazonStores|Amazon Fresh&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Amazon Fresh&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;WALLSTREET BROS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wallstreet Bros Savings&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AMZN Mktp|Amazon.com|AMAZON MKTPL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Amazon.com&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM WITHDRAWAL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM Withdrawal&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ETERNAL HOME LOANS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Eternal Home Loans&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AIRBNB&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Airbnb&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LYFT.*RIDE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lyft Ride&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Uniqlo&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Uniqlo&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                                &lt;span class="nf"&gt;REGEXP_REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                                    &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                                        &lt;span class="nf"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                                    &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                                &lt;span class="c1"&gt;-- Replace strings of letters and numbers after a special character (as long as it appears after the eighth char)&lt;/span&gt;
                                &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(?&amp;lt;!^.{0,8})&lt;/span&gt;&lt;span class="se"&gt;\W\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                            &lt;span class="c1"&gt;-- Replace certain patterns (e.g., 'TST*'), special characters, unwanted strings(e.g. 'LLC')&lt;/span&gt;
                            &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^SP&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3}&lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|^[a-zA-Z]{2,3} &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;+.+$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{3}&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]{2}&lt;/span&gt;&lt;span class="se"&gt;\:\s&lt;/span&gt;&lt;span class="s1"&gt;.|&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s1"&gt;|[^&lt;/span&gt;&lt;span class="se"&gt;\w\s&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;.]|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LLC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;INC&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;Inc&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;LTD&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="c1"&gt;-- Replace single characters hanging at the end of a string (e.g. 'Veterinary H' --&amp;gt; 'Veterinary')&lt;/span&gt;
                        &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]$|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;[a-zA-Z]&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+$&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
                    &lt;span class="c1"&gt;-- Change multiple spaces into one space&lt;/span&gt;
                    &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;-- Fix wrong categories and add new ones (e.g., Dog, Mortgage, Wages &amp;amp; Salary)&lt;/span&gt;
            &lt;span class="k"&gt;CASE&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DRIVER LICENSE RENEW|VEHICLE LICENSING|INSUROTRON|PARKING|SPOTHERO|PAYBYPHONE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Gas|Automotive&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Automotive &amp;amp; Gas&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^PAYMENT TO EMPIRE|Credit Card Payment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Credit card&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^REDEMPTION CREDIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Points cashback&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOVELY DOGGO|GREYHOUND VETERINARY|LOCAL HOUND GROOMER|CHEWY.COM|WHO LET THE PETS OUT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAYSTATION|NBA League|NETFLIX|YouTube|NVIDIA|APPLE.COM/BILL|GOOGLE &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="s1"&gt;Peacock&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Entertainment&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;COSTCO WHSE|INSTACART&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Groceries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TRVL CARD BANK|PARKSRESERVATIONSWEB|TRUSTEDTRAVELER&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Travel&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ATM WITHDRAWAL|FOREIGN EXCHANGE RATE|NON-EMPIRE BANK ATM|^CHECK #&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Misc&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^ETERNAL HOME LOANS&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mortgage&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^DEPOSIT  ID NUMBER|^IRS.*TAX REF&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Other income&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC ACH PMT|^VENMO|^Zelle|^REMOTE ONLINE DEPOSIT&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Reimbursement&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^WALLSTREET BROS|^INVESTCORP|ROBBER BARON INVESTM|APA.*TREAS|^Online Transfer&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Saving &amp;amp; Investing&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;description&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^CORPO INC PAYROLL&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; 
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wages &amp;amp; Salaries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;             
                &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="k"&gt;category&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;-- Group transaction type to simplify grouping later&lt;/span&gt;
            &lt;span class="k"&gt;CASE&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Adjustment|Return&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Returns &amp;amp; Cashback&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CREDIT|DSLIP&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Income &amp;amp; Deposits&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHECK|DEBIT|Fee|Payment|Sale&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                    &lt;span class="kr"&gt;THEN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payments &amp;amp; Transfers&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
                &lt;span class="kr"&gt;ELSE&lt;/span&gt; &lt;span class="nf"&gt;INITCAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;clean_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;-- Add year, quarter, and month for summarizing transactions later&lt;/span&gt;
            &lt;span class="nf"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;YEAR&lt;/span&gt; &lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="kt"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY"_Q"Q&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="n"&gt;qtr_string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY_MM&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;account_id&lt;/span&gt;
        &lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;transactions_demo&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;-- Query referencing the new 'clean_transactions' CTE&lt;/span&gt;
&lt;span class="kr"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;clean_description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clean_transactions&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Food &amp;amp; Drink&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction_date | clean_description     |  amount  
---------------- | --------------------- | ------- 
2024-08-21       | Buzz N Woody Pizza    |  -50.33  
2024-08-17       | Lucky Brewing Cap     |   -7.42      
2024-08-17       | Mesopotamia Mix       |  -29.06  
2024-08-13       | Hole In Wall Thai     |  -52.50  
2024-08-12       | Rocket Taco Town      |  -33.59  
2024-08-11       | Coast Victoria Hote &amp;amp; |  -42.62  
2024-08-10       | Cafe Brio             | -121.86  
2024-08-09       | Friends &amp;amp; Family Bake |   -7.90      
2024-08-09       | Red Fish Blue Fish    |  -32.86  
2024-08-09       | Irish Times Pub       |  -74.75  
2024-08-09       | Craft Victoria        |  -31.78  
2024-08-03       | Din Tai Fung Belle    |  -40.10  
2024-07-26       | Taqueria El           |  -24.89  
...              | ...                   |     ...       

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes!!! With the &lt;code&gt;clean_transactions&lt;/code&gt; CTE, I would be able to finally start summarizing and analyzing the transactions. &lt;/p&gt;

&lt;h2&gt;
  
  
  A couple quick queries
&lt;/h2&gt;

&lt;p&gt;To start, let's look at the total spend per category along with the percentage of total spend that year.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;WITH&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kr"&gt;SELECT&lt;/span&gt; 
    &lt;span class="kt"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;clean_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_spend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="kt"&gt;year&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;pct_of_spend&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clean_transactions&lt;/span&gt;
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wages &amp;amp; Salaries&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Credit card&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Saving &amp;amp; Investing&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Other income&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Points cashback&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;GROUP&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="kt"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="kt"&gt;year&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_spend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;year | clean_category        | total_spend | pct_of_spend 
---- | --------------------- | ----------- | ------------ 
2024 | Mortgage              |   -16196.71 |        38.78 
2024 | Shopping              |    -5309.93 |        12.71 
2024 | Travel                |    -4350.83 |        10.42 
2024 | Dog                   |    -3255.04 |         7.79 
2024 | Bills &amp;amp; Utilities     |    -3208.90 |         7.68 
2024 | Food &amp;amp; Drink          |    -3021.83 |         7.24 
2024 | Groceries             |    -1830.94 |         4.38 
2024 | Automotive &amp;amp; Gas      |    -1446.29 |         3.46 
2024 | Misc                  |     -760.00 |         1.82 
2024 | Home                  |     -715.45 |         1.71 
2024 | Entertainment         |     -687.91 |         1.65 
2024 | Personal              |     -543.92 |         1.30 
2024 | Professional Services |     -393.02 |         0.94 
2024 | Health &amp;amp; Wellness     |     -170.78 |         0.41 
2024 | Gifts &amp;amp; Donations     |      -76.00 |         0.18 
...  | ...                   |         ... |          ... 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, just for fun, I could check my most frequented restaurants in 2024.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="kr"&gt;WITH&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kr"&gt;SELECT&lt;/span&gt; 
    &lt;span class="nf"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clean_description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;visits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;clean_description&lt;/span&gt; &lt;span class="kr"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;restaurant&lt;/span&gt;
&lt;span class="kr"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clean_transactions&lt;/span&gt; 
&lt;span class="kr"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;clean_category&lt;/span&gt; &lt;span class="kr"&gt;IN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Food &amp;amp; Drink&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="ow"&gt;AND&lt;/span&gt; &lt;span class="kt"&gt;year&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;
&lt;span class="kr"&gt;GROUP&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;clean_description&lt;/span&gt;
&lt;span class="kr"&gt;ORDER&lt;/span&gt; &lt;span class="kr"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;visits&lt;/span&gt; &lt;span class="kr"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;visits | restaurant                 
------ | ---------------------------
11     | Roxys Fried Chicken        
6      | Buzz N Woody Pizza         
4      | Mesopotamia Mix            
4      | Mcdonalds                  
3      | Southern Chicken And Waffle
2      | Fantasy Donut Force        
2      | Taqueria El                
2      | Twsp Prk Adam Golf Res     
2      | Taco Tuesday               
2      | Next Door Bakery           
...    | ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...So, yes, there might be a fried chicken problem in this household. &lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you for reading!
&lt;/h2&gt;

&lt;p&gt;I hope my experience has provided ideas for your own personal coding or expense tracking projects. In my next post, I will explore my "essential" and "non-essential" expenses, find large purchases that exceed the average transaction amount, and summarize quarterly spending. In the meantime, if you have any questions or suggestions please let me know. &lt;/p&gt;

&lt;p&gt;If you made it this far, I have a question for you: "What kinds of personal projects did you do when you first started learning SQL?"&lt;/p&gt;

</description>
      <category>sql</category>
      <category>beginners</category>
      <category>postgres</category>
    </item>
  </channel>
</rss>
