I'm using MS SQL 2008 R2, have three tables with following schema:
Table 1: Contains workshift info for each worker
CREATE TABLE workshift (
[ws_id] [bigint] NOT NULL,
[start_date] [datetime] NOT NULL,
[end_date] [datetime] NOT NULL,
[worker_id] [bigint] NOT NULL
)
INSERT INTO workshift VALUES (1, '2012-08-20 08:30:00', '2012-08-20 14:30:00', 1)
INSERT INTO workshift VALUES (2, '2012-08-20 14:30:00', '2012-08-20 22:30:00', 2)
Table 2: Contains monetary denominations
CREATE TABLE currency_denom (
[cd_id] [decimal](7, 2) NOT NULL,
[name] [nchar](100) NOT NULL
)
INSERT INTO currency_denom VALUES (1, '100.00')
INSERT INTO currency_denom VALUES (2, '50.00')
INSERT INTO currency_denom VALUES (3, '20.00')
INSERT INTO currency_denom VALUES (4, '10.00')
INSERT INTO currency_denom VALUES (5, '5.00')
INSERT INTO currency_denom VALUES (6, '1.00')
Table 3: Contains the quantity of each denomination the worker has received in every workshift
CREATE TABLE currency_by_workshift (
[cd_id] [decimal](7, 2) NOT NULL,
[ws_id] [bigint] NOT NULL,
[qty] [int] NOT NULL
)
INSERT INTO currency_by_workshift VALUES (1, 1, 1)
INSERT INTO currency_by_workshift VALUES (2, 1, 2)
INSERT INTO currency_by_workshift VALUES (3, 1, 2)
INSERT INTO currency_by_workshift VALUES (2, 2, 3)
INSERT INTO currency_by_workshift VALUES (4, 2, 4)
INSERT INTO currency_by_workshift VALUES (5, 2, 2)
I need to get the currency_by_workshift values in columns instead of rows, along with the workshift values, that is:
workshift | workshift | workshift | 100.00 | 50.00 | 20.00 | 10.00 | 5.00 | 1.00
ws_id | start_date | end_date | | | | | |
1 | 2012-08-20 08:30:00 | 2012-08-20 14:30:00 | 1 | 2 | 2 | 0 | 0 | 0
2 | 2012-08-20 14:30:00 | 2012-08-20 22:30:00 | 0 | 2 | 0 | 4 | 2 | 0
I'm not able to use a case to count quantities for each currency denomination because they are configurable, if a new denomination is added, the query should be modified. Same applies if using PIVOT function, or I'm wrong?
How can I get the info that way?
@bluefeet provided a very good answer utilizing the built in
PIVOT
functionality. However, I frequently find thePIVOT
andUNPIVOT
nomenclature confusing and I have yet to encounter a situation where the same results can't be achieved with standard aggregations:If you want to do a dynamic pivot, you only need to build a string of the pivot columns once:
What you are trying to do is called a
PIVOT
. There are two ways to do this, either with a Static Pivot or a Dynamic Pivot.Static Pivot - is where you will hard-code the values of the rows to transform to columns (See SQL Fiddle with Demo):
Dynamic pivot is where the columns are determined at run-time (see SQL Fiddle with Demo):
Both versions will produce the same results.