Skip to main content
hic
Former Employee
Former Employee

There are a number of prefixes in QlikView, that help you load and transform data. One of them is the Crosstable transformation.

Whenever you have a crosstable of data, the Crosstable prefix can be used to transform the data and create the desired fields. A crosstable is basically a matrix where one of the fields is displayed vertically and another is displayed horizontally. In the input table below you have one column per month and one row per product.

 

Crosstable transformation4.png

 

But if you want to analyze this data, it is much easier to have all numbers in one field and all months in another, i.e. in a three-column table. It is not very practical to have one column per month, since you want to use Month as dimension and Sum(Sales) as measure.

 

Enter the Crosstable prefix.

 

It converts the data to a table with one column for Month and another for Sales. Another way to express it is to say that it takes field names and converts these to field values. If you compare it to the Generic prefix, you will find that they in principle are each other’s inverses.

 

The syntax is

 

   Crosstable (Month, Sales) Load Product, [Jan 2014], [Feb 2014], [Mar 2014], … From … ;

 

There are however a couple of things worth noting:

  • Usually the input data has only one column as qualifier field; as internal key (Product in the above example). But you can have several. If so, all qualifying fields must be listed before the attribute fields, and the third parameter to the Crosstable prefix must be used to define the number of qualifying fields.
  • It is not possible to have a preceding Load or a prefix in front of the Crosstable keyword. Auto-concatenate will however work.
  • The numeric interpretation will not work for the attribute fields. This means that if you have months as column headers, these will not be automatically interpreted. The work-around is to use the crosstable prefix to create a temporary table, and to run a second pass through it to make the interpretations:

 

   tmpData:

   Crosstable (MonthText, Sales)

   Load Product, [Jan 2014], [Feb 2014], … From Data;

 

   Final:

   Load Product,

      Date(Date#(MonthText,'MMM YYYY'),'MMM YYYY') as Month,

      Sales

      Resident tmpData;

   Drop Table tmpData;

 

Finally, if your source is a crosstable and you also want to display the data as a crosstable, it might be tempting to load the data as it is, without any transformation.

 

I strongly recommend that you don’t. A crosstable transformation simplifies everything and you can still display your data as a crosstable using a standard pivot table.

 

HIC

72 Comments
stevedark
Partner Ambassador/MVP
Partner Ambassador/MVP

Thanks Henric.

I find that there are often further manipulations you need to do after doing your crosstable load.  A common one I have seen is where accountants put the year on it's own row above the Jan column (or in a merged cell) and then repeat that for each year.  You then find when you load with * as Rob and Jason suggest you end up with fields Jan ... Dec, Jan2 ... Dec2, Jan3 ...

The resident load then needs to get a bit cleverer and do something like:

Date(Date#('20' & if(len(MonthText) = 3, '13', '0' & mid(MonthText, 4, 1)), mid(MonthText, 1, 3) & '01', 'YYYYMMDD'), 'DD MMM YYYY') as Month,

There is generally a way to deal with even the most untidy and inconsistent CROSSTABLE.  I have had to in the past load the column headings into a table (using a TRANSPOSE laod) and then pick which of those headings make up the column list - building a string to use in the load script.  All good fun!

Steve

0 Likes
17,893 Views
male_carrasco
Creator
Creator

Nice post Henric!

0 Likes
17,893 Views
robert99
Specialist III
Specialist III

When I download a date into Excel it can be converted (formatted) as a number (and then back to a date etc)

Crosstables convert dates to text

These can be converted in QlikView as DATE (NUM# (InvoiceDate)) as InvoiceDate ,

But when I download into excel its downloaded as text. And I have been unable to change this using whatever combination I have tried eg num (date# etc

I overcame this problem but using Value to convert the text to a value in Excel (this works). But what is the best way to format in QV to overcome this issue (not having to use value in Excel)

edit  it works. Will at least OPDate2 does

date (num# (OPDate)) as OPDate ,
date (num#(OPDate)) as OPDate2,

Strange. I guess I just need to give the date a different name (as OPDate3 works too

17,773 Views
Anonymous
Not applicable

Very useful..thanks!!

0 Likes
17,773 Views
Anonymous
Not applicable

Hello HIC

Very Good

Is possible to do unlike?

Example:

Imagem 2.png

0 Likes
17,773 Views
hic
Former Employee
Former Employee

That is the topic for next week's blog post...

But if you can't wait until then, look for "Generic" in the help.

HIC

17,773 Views
Anonymous
Not applicable

OK, very good, I will search to about it is subject....

But I am anxious for look your next post

0 Likes
17,773 Views
stevedark
Partner Ambassador/MVP
Partner Ambassador/MVP

I seem to recall that Rob Wunderlich has posted on this before, on his QlikView Notes blog.

0 Likes
17,773 Views
prodanov
Partner - Creator
Partner - Creator

But to know Generic Load generate separate table for each value in Column "Field". To create only one table is necessary to join them

0 Likes
17,675 Views
Anonymous
Not applicable

Hello Dimetar

Do you have an example?

Tks

0 Likes
17,675 Views