Qlik Community

Qlik Design Blog

All about product and Qlik solutions: scripting, data modeling, visual design, extensions, best practices, etc.

Announcements
Coming your way, the Qlik Data Revolution Virtual Summit. October 27-29. REGISTER

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

70 Comments
MVP
MVP

Thanks for sharing....

0 Likes
21,064 Views
Luminary
Luminary

Thanks Henric. I find Crosstable() one of the most useful functions in QlikView but it does have one drawback - it is very slow. It does seem to work multi-threaded, but each core is only very slightly utilized. Can you shed some light on how this function works at a CPU-level?

Thanks again,

Jason

0 Likes
21,064 Views
Specialist II
Specialist II

Useful and interesting as always, thanks!

0 Likes
21,064 Views
Specialist III
Specialist III

Hi Henric,

Thanks a lot for the post.

I think here we have to be careful in writing count(Product) as once we create the cross table the Product is repeated. So it has to be count(Distinct Product) to get the number of unique products.

One more thing is how to handle a scenario where we expect more columns to be in coming. like

in your example suppose in the month of Aug 2014 the source will have one more column for Jul2014?

21,064 Views

You are right that Count(distinct Product) is the correct way to count products here.

If you have two different numbers for each month, e.g. no of units and sales amount, then you need to load two tables from the same source:

Crosstable (Month, Sales)

   Load Product, [Sales Jan 2014] as [Jan 2014], [Sales Feb 2014] as [Feb 2014], … From … ;

Crosstable (Month, Units)

   Load Product, [Units Jan 2014] as [Jan 2014], [Units Feb 2014] as [Feb 2014], … From … ;

HIC

21,064 Views
Specialist III
Specialist III

Hi Henric,

Thanks a lot for your response. I still have this question for you.

The Source file will change every month by one additional column presenting the Recent Month.

For example in the month of July 2014 the source file has Jan-2014 till Jun-2014 columns but in Aug-2014 the source file will change and will have one more column as Jul-2014.

I would like to take your advice how to handle this type of Source files in QlikView.

Is it like I may have to put an if else block which checks the current month and based on which it will have a cross table load script.

In that case I may end up in creating 12 different script blocks per every month. Thanks in advance.

21,064 Views