Disclaimer: I imported this post from WordPress to Jekyll on 9/2/23. Forgive the misformatting until I get a chance to clean it up.
I had a data set (pricing by state) delivered last week from a business application user that I needed to import into the application’s database. The user provided an Excel worksheet in the format below:
SKU | TN | MS | AR |
---|---|---|---|
1 | .99 | .89 | .89 |
2 | 1.09 | .99 | .99 |
3 | .99 | 1.09 | .99 |
My database table, however, was designed as follows:
Sku | State | Price |
---|---|---|
4 | TN | .89 |
4 | MS | .99 |
4 | AR | 1.09 |
5 | TN | .89 |
5 | AR | 1.09 |
5 | MS | .99 |
I needed a plan to transform the worksheet data to match my table’s structure.
First, I imported the data from the Excel workbook directly into a new table ([tmpPrices]
) using the SSMS Import and
Export
Wizard.
Then, I could INSERT INTO SELECT
from the imported table
using the query below. The UNPIVOT
operator rotates the [State]
column identifiers into row values that align with a
particular [SKU]
. The column specified before the UNPIVOT
operator ([Price]
) is the one that holds the values that
are currently under the columns being rotated. The column that will contain the column values that I rotated follows the
operator ([State]
).
INSERT INTO [Prices]
([Sku],
[State],
[Price]
)
SELECT [SKU],
[State],
[Price]
FROM
(
SELECT [SKU],
[AR],
[MS],
[TN]
FROM [tmpPrices]
) p UNPIVOT([Price] FOR [State] IN([AR],
[MS],
[TN])) unpvt;
via Microsoft