The previous TechTip focused on COUNT, MIN, MAX, SUM and AVG—all very useful column functions. However, the last two functions can produce results that are not very user-friendly. This TechTip will help you solve that.
By Rafael Victória-Pereira
Say you have a beautifully crafted SQL statement that returns the average of some complicated operation between columns of a given subset of data. It saved you hours of writing intermediate queries and complicated joins (by the way, here are a couple of refreshers about table joins, if you need them), but the result is most unfortunate: a very long number with loads and loads of decimal places. So what do you do? Rewrite the query to get a “prettier” result? No, there’s a better way: use CAST.
CAST, The Polymorphic Function
While DIGITS allows you to convert a character string into its numeric value, it doesn’t allow you to be very specific about the number of decimal places of the number. It’s true that there are other conversion functions you can use, depending on your specific need, such as BIGINT, BINARY, BLOB, CHAR, CLOB, and DATE, to name just a few. But the beauty of the CAST function is that it can do the same as all the others and allow you to specify the number of decimal places (which solves the problem I mentioned before). Let’s revisit the SQL statement that returns the average salary and modify it, in order to return a user-friendly amount instead of that awful number:
SELECT CAST (AVG(TESA) AS DECIMAL (11, 2)) AS AVERAGE_SALARY
FROM UMADB_CHP2.PFTEM
;
What’s going on here? Well, it’s a function within another function: AVG(TESA) calculates the average of the salaries, just like before, but then the CAST function that encloses it converts the ugly numeric result returned by the AVG function into a DECIMAL(11, 2). I’ve used CAST in many different scenarios—from “data beautification,” as in this case, to situations in which different tables that share a key don’t have the key fields in the same format or even data type. Let’s say Table A has a CHAR column containing a numeric ID as primary key and you want to join it to Table B, which has a DECIMAL(9, 0) as a key. What can you do? Simply CAST one of them to the other one’s type; be careful because the CHAR column can contain letters, which you can’t cast to the decimal column. When casting, always have a look at the data first, to make sure you won’t run into problems. Be sure to read this section of the SQL reference manual for V7.3 regarding casting between data types. CAST is indeed a very powerful tool, and I prefer its readability when it comes to specifying the output data type over the aforementioned conversion functions.
Aggregating Data with GROUP BY
User requests often require little more than a regular SELECT statement, but standardized reports usually include aggregated information obtained with some of the column functions I’ve mentioned before. Let’s say the university’s board wants to know the average salary by teacher rank and how many teachers are in each of these ranks. So far, the column functions used included a single piece of data, such as a count, or an average, or at most, two functions combined. To answer this question, we’ll need to list the teacher rank, which is a column of the teachers table, and two functions (a count of the teachers per rank and their average salary). My guess is that you already figured out how to write this statement, based on what I’ve shown before. However, if you try to run this statement without a GROUP BY clause, it will end in error. Why? Well, because you’ll be trying to aggregate data (by using the functions) and display all the records at once (the teachers’ ranks). That’s where the GROUP BY clause comes into play: it allows you to, well, group information by a given expression—typically a column of the SELECT list. If you’re having trouble following my train of thought, take a moment to analyze the following statement:
SELECT TETR AS TEACHER_RANK
, CAST (AVG(TESA) AS DECIMAL (11, 2)) AS AVERAGE_SALARY
, COUNT(TETR) AS NUMBER_OF_TEACHERS
FROM UMADB_CHP2.PFTEM
GROUP BY TETR
;
This is the magic of GROUP BY: You can use quite a few column functions and present sectioned results. Even though I’m using only one column in the GROUP BY clause, it’s possible to use as many as you want or even more complex grouping expressions, which can resemble a Microsoft Excel pivot table (presenting both the grouped rows and the subtotals)—more on that later in this series.
That’s all for now! Next time around, I’ll discuss INSERT and its two “flavors.”
LATEST COMMENTS
MC Press Online