How to store multiple data types for same column (for many columns)
I'm the author of the book you referenced. Thanks for reading my book!
I suggest you read chapter 14, &quot;Fear of the Unknown.&quot;
For your case:

I am entering the quantity of elements detected in a sample and, if the quantity of an element is not detected, then I must be able to identify that an element was tested, but not detected, such as &quot;ND&quot;.

I would not store the string value &quot;ND&quot;. I would store NULL instead of a number when the value is unknown or inapplicable.
Then when you query it, you can use:
SELECT COALESCE(myNumericColumn1, 'ND') AS myNumericColumn1
FROM Mytable
...;

The COALESCE() function in SQL returns its first argument that is not NULL. In this example, if the numeric is NULL on a given row, the result will use the default value in the second argument, 'ND'.
You can also create a VIEW with this expression for each column, so you don't have to repeat it in every query.

Re your comment:
This is starting to sound like you need to store the results in rows, not _columns. One numeric result per row. Just two three columns:

Sample ID
Element ID
Numeric value

Then you can make a distinction between three states:

Presence of a row with a non-NULL numeric value.
Presence of a row, but NULL for the numeric value, indicating the test was done but the result was Not Detected.
Absence of a row, indicating the element test was not done.

When you want your client to display the results for a sample, you would fetch 30 rows (or fewer if not all elements were tested in a given sample), then write code in your client to loop over the 30 rows, and present the data however you want.