I have two tables: Standards and Service Offers. A standard may have several service offerings. Each Standard may have a different number of Services associated with it.
What I need to do is write a view that will return some general data and then list the service offers in one line. For instance:
Standard Id | Description | SO
I do not know how to write it. The number of SO columns is set to a specific number (in this case, 21), so we cannot exceed this.
Any ideas on how to approach this?
The place I started is below. He simply returned a few lines for each service offer when they should be on the same line.
SELECT * FROM SERVICE_OFFERINGS WHERE STANDARD_KEY IN (SELECT STANDARD_KEY FROM STANDARDS)
Additional SQL
So, here I have SQL, which returns everything I need, but will return 11 rows due to the presence of 11 service offers. I tried a pivot table and can't figure out how to do this. Can anyone help with some sample code?
SELECT DISTINCT stpc.standard_key, stpc.test_id, NULL AS pricebook_id, stpc.stabdard_name AS description, stpc.date_start AS begin_date, stpc.date_end AS end_date, sopd.service_offering_id FROM STANDARDS stpc, SERVICE_OFFERINGS sopd WHERE 1=1 AND sopd.standard_key = stpc.standard_key ORDER BY stpc.standard_key, sopd.service_offering_id
UPDATE
Since the database does not allow PIVOT tables (and could not understand the XML sentence), I had to do a bit of complicated SQL to get it working. Here is what I used:
select stpc.oracle_product_code AS test_id, CASE WHEN stpc.store_key = 200 THEN 'CE_USAUSD09' WHEN stpc.store_key = 210 THEN 'CE_CANCAD09' END AS pricebook_id, stpc.standard_name AS its_test_desc, CONVERT(VARCHAR(10), stpc.date_start, 101) AS begin_date, CONVERT(VARCHAR(10), stpc.date_end, 101) AS end_date, MAX(CASE WHEN rn = 1 THEN b.service_offering_id END) AS SERVICE_OFFERING_1, MAX(CASE WHEN rn = 2 THEN b.service_offering_id END) AS SERVICE_OFFERING_2, MAX(CASE WHEN rn = 3 THEN b.service_offering_id END) AS SERVICE_OFFERING_3, MAX(CASE WHEN rn = 4 THEN b.service_offering_id END) AS SERVICE_OFFERING_4, MAX(CASE WHEN rn = 5 THEN b.service_offering_id END) AS SERVICE_OFFERING_5, MAX(CASE WHEN rn = 6 THEN b.service_offering_id END) AS SERVICE_OFFERING_6, MAX(CASE WHEN rn = 7 THEN b.service_offering_id END) AS SERVICE_OFFERING_7, MAX(CASE WHEN rn = 8 THEN b.service_offering_id END) AS SERVICE_OFFERING_8, MAX(CASE WHEN rn = 9 THEN b.service_offering_id END) AS SERVICE_OFFERING_9, MAX(CASE WHEN rn = 10 THEN b.service_offering_id END) AS SERVICE_OFFERING_10, MAX(CASE WHEN rn = 11 THEN b.service_offering_id END) AS SERVICE_OFFERING_11, MAX(CASE WHEN rn = 12 THEN b.service_offering_id END) AS SERVICE_OFFERING_12, MAX(CASE WHEN rn = 13 THEN b.service_offering_id END) AS SERVICE_OFFERING_13, MAX(CASE WHEN rn = 14 THEN b.service_offering_id END) AS SERVICE_OFFERING_14, MAX(CASE WHEN rn = 15 THEN b.service_offering_id END) AS SERVICE_OFFERING_15, MAX(CASE WHEN rn = 16 THEN b.service_offering_id END) AS SERVICE_OFFERING_16, MAX(CASE WHEN rn = 17 THEN b.service_offering_id END) AS SERVICE_OFFERING_17, MAX(CASE WHEN rn = 18 THEN b.service_offering_id END) AS SERVICE_OFFERING_18, MAX(CASE WHEN rn = 19 THEN b.service_offering_id END) AS SERVICE_OFFERING_19, MAX(CASE WHEN rn = 20 THEN b.service_offering_id END) AS SERVICE_OFFERING_20, MAX(CASE WHEN rn = 21 THEN b.service_offering_id END) AS SERVICE_OFFERING_21, MAX(rn) AS service_offering_count FROM ( select standard_key, service_offering_id, row_number() over (partition by standard_key order by standard_key) rn from SERVICE_OFFERINGS ) B, SERVICE_OFFERINGS sopd, STANDARDS stpc where b.service_offering_id = sopd.service_offering_id AND b.standard_key = stpc.standard_key AND sopd.standard_key = stpc.standard_key AND stpc.store_key IN (200,210) AND stpc.create_date > '03/29/2010' group by stpc.oracle_product_code,stpc.store_key,stpc.standard_name,stpc.date_start,stpc.date_end