"The difference between genius and stupidity is that genius has its limits"
– Albert Einstein
Error – Division by zero
You get an error when you DIVIDE by ZERO! Let’s turn the page and fix it!
Error – Division by zero
You get an error when you DIVIDE by ZERO! Let’s turn the page and fix it!
SELECT Class_Code
,Grade_Pt / ( NULLIFZERO (Grade_pt) * 2 ) AS Math1
FROM Sample_Table;
What the NULLIFZERO does is make a zero into a NULL. So, the answer set you’d get from this is a simple ‘ FR’, and then a NULL value represented usually by a ‘? ’. If you have a calculation where a ZERO could kill the operation, and you don’t want that, you can use the NULLIFZERO command to convert any zero value to a null value.
SELECT NULLIFZERO (Cust_No) AS Cust_No
,NULLIFZERO (Acc_Balance) AS Acc_Balance
,NULLIFZERO (Location) AS Location
FROM Sample_Table ;
Fill in the Answer Set above after looking at the table and the query.
Okay! Time to show me your brilliance! What would the Answer Set produce?
SELECT NULLIFZERO (Cust_No) AS Cust_No
,NULLIFZERO (Acc_Balance) AS Acc_Balance
,NULLIFZERO (Location) AS Location
FROM Sample_Table ;
Here is the answer set! How’d you do? The NULLIFZERO command found a zero in Cust_No, so it made it Null. The others were not zero, so they retained their value. The only time NULLIFZERO changes data is if it finds a zero, and then it changes it to null.
SELECT NULLIF(Cust_No, 0) AS Cust1
,NULLIF(Cust_No, 3) AS Cust2
,NULLIF(Acc_Balance, 0) AS Acc1
,NULLIF(Acc_Balance, 3) AS Acc2
,NULLIF(Location, 0) AS Loc1
,NULLIF(Location, 3) AS Loc2
FROM Sample_Table;
Fill in the Answer Set above after looking at the table and the query.
You can also use the NULLIF(). What you are asking Redshift to do is to NULL the answer if the COLUMN matches the number in the parentheses. What would the above Answer Set produce from your analysis?
SELECT NULLIF(Cust_No, 0) AS Cust1
,NULLIF(Cust_No, 3) AS Cust2
,NULLIF(Acc_Balance, 0) AS Acc1
,NULLIF(Acc_Balance, 3) AS Acc2
,NULLIF(Location, 0) AS Loc1
,NULLIF(Location, 3) AS Loc2
FROM Sample_Table;
Look at the answers above, and if it doesn’t make sense, go over it again until it does.
SELECT ZEROIFNULL (Cust_No) as Cust
,ZEROIFNULL (Acc_Balance) as Balance
,ZEROIFNULL (Location) as Location
FROM Sample_Table ;
Fill in the Answer Set above after looking at the table and the query.
This is the ZEROIFNULL. What it will do is put a zero into a place where a NULL shows up. Fill in what you think the answer set will be.
SELECT ZEROIFNULL (Cust_No) as Cust
,ZEROIFNULL (Acc_Balance) as Balance
,ZEROIFNULL (Location) as Location
FROM Sample_Table ;
The answer set placed a zero in the place of the NULL Acc_Balance, but the other values didn’t change because they were NOT Null.
SELECT Last_Name
,COALESCE (Home_Phone, Work_Phone, Cell_Phone)
as Phone
FROM Sample_Table ;
Last_Name |
Phone |
Fill in the Answer Set above after looking at the table and the query
Coalesce returns the first non-Null value in a list, and if all values are Null, returns Null.
SELECT Last_Name
,COALESCE (Home_Phone, Work_Phone, Cell_Phone)
as Phone
FROM Sample_Table ;
Last_Name |
Phone |
Jones |
555-1234 |
Patel |
456-7890 |
Gonzales |
354-0987 |
Nguyen |
? |
Coalesce returns the first non-Null value in a list, and if all values are Null, returns Null.
SELECT Last_Name
,COALESCE (Home_Phone, Work_Phone, Cell_Phone, 'No Phone')
as Phone
FROM Sample_Table ;
Last_Name |
Phone |
Fill in the answer set above after looking at the table and the query
Coalesce returns the first non-Null value in a list, and if all values are Null, returns Null. Since we decided in the above query we don’t want NULLs, notice we have placed a literal ‘No Phone’ in the list. How will this affect the Answer Set?
SELECT Last_Name
,COALESCE (Home_Phone, Work_Phone, Cell_Phone, 'No Phone')
as Phone
FROM Sample_Table ;
Last_Name |
Phone |
Jones |
555-1234 |
Patel |
456-7890 |
Gonzales |
354-0987 |
Nguyen |
No Phone |
Answers are above! We put a literal in the list so there’s no chance of NULL returning.
CAST will convert a column or value’s data type temporarily into another data type. Below is the syntax:
Data can be converted from one type to another by using the CAST function. As long as the data involved does not break any data rules (i.e. placing alphabetic or special characters into a numeric data type), the conversion works. The name of the CAST function comes from the Convert And STore operation that it performs.
SELECT CAST('ABCDE' AS CHAR(1) ) AS Trunc
,CAST(128 AS CHAR(3) ) AS OK
,CAST(127 AS INTEGER ) AS Bigger ;
The first CAST truncates the five characters (left to right) to form the single character ‘A’. In the second CAST, the integer 128 is converted to three characters and left justified in the output. The 127 was initially stored in a SMALLINT (5 digits - up to 32767) and then converted to an INTEGER. Hence, it uses 11 character positions for its display, ten numeric digits and a sign (positive assumed) and right justified as numeric.
SELECT CAST(121.53 AS SMALLINT) AS Whole
,CAST(121.53 AS DECIMAL(3,0)) AS Rounder ;
Whole |
Rounder |
121 |
122 |
The value of 121.53 was initially stored as a DECIMAL as 5 total digits with 2 of them to the right of the decimal point. Then, it is converted to a SMALLINT using CAST to remove the decimal positions. Therefore, it truncates data by stripping off the decimal portion. It does not round data using this data type. On the other hand, the CAST in the fifth column called Rounder is converted to a DECIMAL as 3 digits with no digits (3,0) to the right of the decimal, so it will round data values instead of truncating. Since .53 is greater than .5, it is rounded up to 122.
If the value of the digit to the right of the rounding digit is < 5 then nothing changes
If the value of the digit to the right of the rounding digit is > 5 then it increases by 1
If the value of the digit to the right of the rounding digit = 5
AND there are no trailing non-zero digits
If the value of the rounding digit is odd then increase by 1
If the value of the rounding digit is even then nothing changes
If the value of the digit to the right of the rounding digit = 5
AND there are trailing non-zero digits
Rounding behaves as if the value of the digit to the right of the rounding digit is greater than 5
Above are the rules for how Teradata approaches rounding of fractional data.
SELECT
CAST(.014 AS Decimal(3,2))
,CAST(.016 AS Decimal(3,2))
,CAST(.015 AS Decimal(3,2))
,CAST(.0150 AS Decimal(3,2))
,CAST(.0250 AS Decimal(3,2))
,CAST(.0159 AS Decimal(3,2))
Memorize this information so you can nail it on the test. You have the rules so you have the power to succeed here.
SELECT Order_Number as OrdNo
,Customer_Number as CustNo
,Order_Date
,Order_Total
,CAST(Order_Total as integer) as Chopped
,CAST(Order_Total as Decimal(5,0)) as Rounded
FROM Order_Table ;
The Column Chopped takes Order_Total (a Decimal (10,2) and CASTs it as an integer which chops off the decimals. Rounded CASTs Order_Total as a Decimal (5,0), which takes the decimals and rounds up if the decimal is .50 or above.
SELECT <column-name> ( <data-type> [(<length>)]
FROM <table-name> ;
SELECT 'ABCDE' (CHAR(1)) AS Shortened
,128 (CHAR(3)) AS OOPS1
,-128 (CHAR(3)) AS OOPS2
,128 (INTEGER) AS Bigger
,121.13 (SMALLINT) AS Whole ;
This Teradata extension conversion is requested by placing the “implied” data type conversion in parentheses after the column name. What happened in the column named OOPS1 and OOPS2? the value 128 is 1 greater than 127 and therefore too large of a value to store in a BYTEINT. So it is automatically stored as a SMALLINT (5 digits plus a sign) before the conversion. The implicit conversion changes it to a character type with the first 3 characters being returned. As a result, only the first 3 spaces are seen in the report (_ _ _ 128). Likewise, OOPS2 is stored as (_ _ -128) with the first three characters (2 spaces and - ) shown in the output.
Sample_Table |
|
Course_Name |
Credits |
Tera-Tom on SQL |
1 |
SELECT Course_Name
,CASE Credits
WHEN 1 THEN 'One Credit'
WHEN 2 THEN 'Two Credits'
WHEN 3 THEN 'Three Credits'
END AS CreditAlias
FROM Sample_Table ;
Fill in the Answer Set above after looking at the table and the query.
This is a CASE STATEMENT which allows you to evaluate a column in your table, and from that, come up with a new answer for your report. Every CASE begins with a CASE, and they all must end with a corresponding END. What would the answer be?
This is a CASE STATEMENT which allows you to evaluate a column in your table, and from that, come up with a new answer for your report. Every CASE begins with a CASE, and they all must end with a corresponding END. What would the answer be?
The second example is better unless you have a simple query like the first example.
Look at the CASE Statement and look at the Course_Table, and fill in the Answer Set.
Above is the full answer set.
Look at the CASE Statement and look at the Course_Table, and fill in the Answer Set.
Above is the full answer set.
SELECT Course_Name
,CASE Credits
WHEN 1 THEN 'One Credit'
WHEN 2 THEN 'Two Credits'
WHEN 3 THEN 'Three Credits'
END AS CreditAlias
FROM Sample_Table ;
Notice now that we have a 4 under the ‘Credit’ Column. However, in our CASE statement, we don’t have instructions on what to do if the number is 4. What will occur?
SELECT Course_Name
,CASE Credits
WHEN 1 THEN 'One Credit'
WHEN 2 THEN 'Two Credits'
WHEN 3 THEN 'Three Credits'
END AS CreditAlias
FROM Sample_Table ;
A null value will occur when the evaluation falls through the case and there is no else statement. Notice above that we have a 4 under the ‘Credit’ Column. However, in our CASE statement, we don’t have instructions on what to do if the number is 4. That is why the null value is in the report.
SELECT Course_Name
,CASE Credits
WHEN 1 THEN 'One Credit'
WHEN 2 THEN 'Two Credits'
WHEN 3 THEN 'Three Credits'
ELSE 'Don"t Know"
END AS CreditAlias
FROM Sample_Table ;
Notice now that we have a 4 under the ‘Credit’ Column. However, in our CASE statement, we don’t have instructions on what to do if the number is 4. What will occur?
Since our value of 4 fell through the CASE statement, the ELSE statement kicked in and we delivered ‘Don’t Know’. Notice two single quotes that provided the word Don’t.
Notice now that we don’t have an ALIAS for the CASE Statement. What will the system place in there for the Column Title.
Notice now that we don’t have an ALIAS for the CASE Statement. The title given by default is < CASE Expression >. That is why you should ALIAS your Case statements.
This Query above uses both a Valued Case and Searched Case. That’s ALLOWED!
SELECT
AVG(CASE Class_Code
WHEN 'FR' THEN Grade_pt
ELSE NULL END) (format 'Z.ZZ') AS Freshman_GPA
,AVG(CASE Class_Code
WHEN 'SO' THEN Grade_pt
ELSE NULL END) (format 'Z.ZZ') AS Sophomore_GPA
,AVG(CASE Class_Code
WHEN 'JR' THEN Grade_pt
ELSE NULL END) (format 'Z.ZZ') AS Junior_GPA
,AVG(CASE Class_Code
WHEN 'SR' THEN Grade_pt
ELSE NULL END) (format 'Z.ZZ') AS Senior_GPA
FROM Student_Table
WHERE Class_Code IS NOT NULL ;
Aggregates ignore Nulls so knowing this trick has allowed for Horizontal Reporting
SELECT Last_Name
,CASE Class_Code
WHEN 'JR' THEN 'Jr '
||(CASE WHEN Grade_pt < 2 THEN 'Failing'
WHEN Grade_pt < 3.5 THEN 'Passing'
ELSE 'Exceeding'
END)
ELSE 'Sr '
||(CASE WHEN Grade_pt < 2 THEN 'Failing'
WHEN Grade_pt < 3.5 THEN 'Passing'
ELSE 'Exceeding'
END)
END AS Status
FROM Student_Table WHERE Class_Code IN ('JR','SR')
ORDER BY Class_Code, Last_Name;
Last_Name |
Status |
Bond |
Jr Exceeding |
McRoberts |
Jr Failing |
Delaney |
Sr Passing |
Phillips |
Sr Passing |
A NESTED Case occurs when you have a Case Statement within another CASE Statement. Notice the Double Pipe symbols (||) that provide Concatenation.
I will bet you didn’t know you could put a CASE statement in the Order By? You do now!