CREATE VIEW IN DB2 - sql

I have a DB2 SQL statement which selects the required rows successfully. Since its a time consuming query, I am trying to convert it into a view using the create view statement.
WITH firstequiprrn
AS (SELECT oeord# equiporder,
Min(RRN(a)) firstrow
FROM iesqafile.OPEQUIP a
GROUP BY oeord#
ORDER BY 1),
firstequiprow
AS (SELECT oeord#,
oetrlr equipmentnumber
FROM firstequiprrn
INNER JOIN iesqafile.OPEQUIP b
ON equiporder = oeord#
AND firstrow = RRN(b)),
ordermiles
AS (SELECT mmord#,
mmtotal
FROM iesqafile.mmiles
WHERE mmord# IN(SELECT orodr#
FROM iesqafile.order)
AND mmrectype = 'O'
AND mmdsp# = '00'),
stopgroup
AS (SELECT soord stoporder,
COUNT(*) stopsremain,
Min(sostp#) nextstop,
Max(soappr) apptreq,
Max(soaptm) apptmade
FROM iesqafile.stopoff
INNER JOIN iesqafile.order
ON orodr# = soord
WHERE soardt = 0
GROUP BY soord
ORDER BY 1) SELECT a.orodr# orodr_,
orcust,
orldat,
CASE orpdat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orpdat), 'YYYY-MM-DD')
END erdat2,
CASE orptim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(orptim, 1, 2), ':'),
SUBSTRING(orptim, 3, 4))
END AS ertim2,
CASE orapdt
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orapdt), 'YYYY-MM-DD')
END ltdat2,
CASE oraptm
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(oraptm, 1, 2), ':'),
SUBSTRING(oraptm, 3, 4))
END AS lttim2,
CASE orddat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orddat), 'YYYY-MM-DD')
END dldat2,
CASE ordtim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(ordtim, 1, 2), ':'),
SUBSTRING(ordtim, 3, 4))
END AS dltim2,
orestr,
a.ordv# ordv_,
orcons,
oreqty,
orspec,
a.orstp# orstp_,
orcomc,
( CASE
WHEN mmtotal IS NOT NULL THEN mmtotal
ELSE 0
END ) mmtotal,
orwgt,
orocty,
orost,
ordcty,
ordst,
orara asarea,
orpdrv oprdrv,
orld# orld_,
ordsp# ordsp_,
orshdt,
orshtm,
ornwpk,
( CASE
WHEN equipmentnumber IS NOT NULL THEN equipmentnumber
ELSE ''
END ) EquipmentNumber,
( CASE
WHEN apptreq IS NOT NULL THEN apptreq
ELSE 'N'
END ) apptreq,
( CASE
WHEN apptmade IS NOT NULL THEN apptmade
ELSE 'N'
END ) apptmade,
( CASE
WHEN ununit IS NOT NULL THEN ununit
ELSE ' '
END ) UNUNIT,
( CASE
WHEN unsupr IS NOT NULL THEN unsupr
ELSE ' '
END ) asdrmgr,
( CASE
WHEN unfmgr IS NOT NULL THEN unfmgr
ELSE ' '
END ) asflmgr,
( CASE
WHEN untrl1 IS NOT NULL THEN untrl1
ELSE ' '
END ) UNTRL1
FROM iesqafile.order a
LEFT OUTER JOIN ordermiles
ON mmord# = a.orodr#
LEFT OUTER JOIN firstequiprow
ON a.orodr# = oeord#
LEFT OUTER JOIN stopgroup
ON a.orodr# = stoporder
LEFT OUTER JOIN iesqafile.units
ON ununit = a.orpdrv
WHERE orld# <> ordsp#
AND ( orspec = 'N# C'
OR orspec = 'N# P' )
AND orpdrv <> ''
AND orpdat >= 2018001
UNION
SELECT d.orodr# as ordddd,
orcust,
orldat,
CASE orpdat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orpdat), 'YYYY-MM-DD')
END erdat2,
CASE orptim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(orptim, 1, 2), ':'),
SUBSTRING(orptim, 3, 4))
END AS ertim2,
CASE orapdt
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orapdt), 'YYYY-MM-DD')
END ltdat2,
CASE oraptm
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(oraptm, 1, 2), ':'),
SUBSTRING(oraptm, 3, 4))
END AS lttim2,
CASE orddat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orddat), 'YYYY-MM-DD')
END dldat2,
CASE ordtim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(ordtim, 1, 2), ':'),
SUBSTRING(ordtim, 3, 4))
END AS dltim2,
orestr,
ordv#,
orcons,
oreqty,
orspec,
orstp#,
orcomc,
( CASE
WHEN mmtotal IS NOT NULL THEN mmtotal
ELSE 0
END ) mmtotal,
orwgt,
orocty,
orost,
ordcty,
ordst,
orara,
orpdrv,
orld#,
ordsp#,
orshdt,
orshtm,
ornwpk,
( CASE
WHEN equipmentnumber IS NOT NULL THEN equipmentnumber
ELSE ' '
END ) EquipmentNumber,
( CASE
WHEN apptreq IS NOT NULL THEN apptreq
ELSE 'N'
END ) apptreq,
( CASE
WHEN apptmade IS NOT NULL THEN apptmade
ELSE 'N'
END ) apptmade,
( CASE
WHEN ununit IS NOT NULL THEN ununit
ELSE ' '
END ) UNUNIT,
( CASE
WHEN unsupr IS NOT NULL THEN unsupr
ELSE ' '
END ) UNSUPR,
( CASE
WHEN unfmgr IS NOT NULL THEN unfmgr
ELSE ' '
END ) UNFMGR,
( CASE
WHEN untrl1 IS NOT NULL THEN untrl1
ELSE ' '
END ) UNTRL1
FROM iesqafile.opplan
LEFT OUTER JOIN iesqafile.order d
ON d.orodr# = opord#
LEFT OUTER JOIN ordermiles
ON mmord# = d.orodr#
LEFT OUTER JOIN firstequiprow
ON d.orodr# = oeord#
LEFT OUTER JOIN stopgroup
ON d.orodr# = stoporder
LEFT OUTER JOIN iesqafile.units
ON ununit = d.orpdrv
So my first attempt to create the view was simply to add a CREATE VIEW AS at the beginning of the first statement. This resulted in the error below:
A column list must be specified because the result columns are unnamed.
I am failing to understand this error as the column headings are indeed specified as the select works without issues. All columns are displayed with appropriate headings.
However I tried to modify the query by adding the below instead of the simple create view.
create view pavt.v1 (v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,v30,v31,v32,v33,v34,v35,v36) as
This seemed to have worked and the view was created in library PAVT. However when I run a select on the view, I get an aritmetic overflow error with DB2 error code of -802.
I dont understand this as I am able to view the results but the issue comes only while attempting to create the query. Can somebody guide please?
A more detailed error description is below:
Message . . . . : Select or omit error on field
Cast(Translate(ORDER_14.ORPTIM, *UNNAMED Table) AS member V.
Cause . . . . . : A select or omit error occurred in record 0, record format
*FIRST, member number 1 of file V in library PAVT, because of condition 1 of
the following conditions:
1 - The data was not valid in a decimal field.
At this moment what I really want to know is if the method I am following to create the view is correct (atleast as far as the syntax goes). Maybe the error I am seeing is a data error?
Edit-1:
create view pavt.CCC1 as
WITH firstequiprrn
AS (SELECT oeord# equiporder,
Min(RRN(a)) firstrow
FROM iesqafile.OPEQUIP a
GROUP BY oeord#
ORDER BY 1),
firstequiprow
AS (SELECT oeord#,
oetrlr equipmentnumber
FROM firstequiprrn
INNER JOIN iesqafile.OPEQUIP b
ON equiporder = oeord#
AND firstrow = RRN(b)),
ordermiles
AS (SELECT mmord#,
mmtotal
FROM iesqafile.mmiles
WHERE mmord# IN(SELECT orodr#
FROM iesqafile.order)
AND mmrectype = 'O'
AND mmdsp# = '00'),
stopgroup
AS (SELECT soord stoporder,
COUNT(*) stopsremain,
Min(sostp#) nextstop,
Max(soappr) apptreq,
Max(soaptm) apptmade
FROM iesqafile.stopoff
INNER JOIN iesqafile.order
ON orodr# = soord
WHERE soardt = 0
GROUP BY soord
ORDER BY 1) SELECT a.orodr# orodr_,
orcust,
orldat,
CASE orpdat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orpdat), 'YYYY-MM-DD')
END erdat2,
CASE orptim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(char(orptim), 1, 2), ':'),
SUBSTRING(char(orptim), 3, 4))
END AS ertim2,
CASE orapdt
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orapdt), 'YYYY-MM-DD')
END ltdat2,
CASE oraptm
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(oraptm, 1, 2), ':'),
SUBSTRING(oraptm, 3, 4))
END AS lttim2,
CASE orddat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orddat), 'YYYY-MM-DD')
END dldat2,
CASE ordtim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(ordtim, 1, 2), ':'),
SUBSTRING(ordtim, 3, 4))
END AS dltim2,
orestr,
a.ordv# ordv_,
orcons,
oreqty,
orspec,
a.orstp# orstp_,
orcomc,
( CASE
WHEN mmtotal IS NOT NULL THEN mmtotal
ELSE 0
END ) mmtotal,
orwgt,
orocty,
orost,
ordcty,
ordst,
orara asarea,
orpdrv oprdrv,
orld# orld_,
ordsp# ordsp_,
orshdt,
orshtm,
ornwpk,
( CASE
WHEN equipmentnumber IS NOT NULL THEN equipmentnumber
ELSE ''
END ) EquipmentNumber,
( CASE
WHEN apptreq IS NOT NULL THEN apptreq
ELSE 'N'
END ) apptreq,
( CASE
WHEN apptmade IS NOT NULL THEN apptmade
ELSE 'N'
END ) apptmade,
( CASE
WHEN ununit IS NOT NULL THEN ununit
ELSE ' '
END ) UNUNIT,
( CASE
WHEN unsupr IS NOT NULL THEN unsupr
ELSE ' '
END ) asdrmgr,
( CASE
WHEN unfmgr IS NOT NULL THEN unfmgr
ELSE ' '
END ) asflmgr,
( CASE
WHEN untrl1 IS NOT NULL THEN untrl1
ELSE ' '
END ) UNTRL1
FROM iesqafile.order a
LEFT OUTER JOIN ordermiles
ON mmord# = a.orodr#
LEFT OUTER JOIN firstequiprow
ON a.orodr# = oeord#
LEFT OUTER JOIN stopgroup
ON a.orodr# = stoporder
LEFT OUTER JOIN iesqafile.units
ON ununit = a.orpdrv
WHERE orld# <> ordsp#
AND ( orspec = 'N# C'
OR orspec = 'N# P' )
AND orpdrv <> ''
AND orpdat >= 2018001
UNION
SELECT d.orodr# orodr_,
orcust,
orldat,
CASE orpdat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orpdat), 'YYYY-MM-DD')
END erdat2,
CASE orptim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(char(orptim), 1, 2), ':'),
SUBSTRING(char(orptim), 3, 4))
END AS ertim2,
CASE orapdt
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orapdt), 'YYYY-MM-DD')
END ltdat2,
CASE oraptm
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(oraptm, 1, 2), ':'),
SUBSTRING(oraptm, 3, 4))
END AS lttim2,
CASE orddat
WHEN 0 THEN Varchar(0)
ELSE Varchar_format(CHAR(orddat), 'YYYY-MM-DD')
END dldat2,
CASE ordtim
WHEN 0 THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(ordtim, 1, 2), ':'),
SUBSTRING(ordtim, 3, 4))
END AS dltim2,
orestr,
ordv# ordv_,
orcons,
oreqty,
orspec,
orstp# orstp_,
orcomc,
( CASE
WHEN mmtotal IS NOT NULL THEN mmtotal
ELSE 0
END ) mmtotal,
orwgt,
orocty,
orost,
ordcty,
ordst,
orara asarea,
orpdrv oprdrv,
orld# orld_,
ordsp# ordsp_,
orshdt,
orshtm,
ornwpk,
( CASE
WHEN equipmentnumber IS NOT NULL THEN equipmentnumber
ELSE ' '
END ) EquipmentNumber,
( CASE
WHEN apptreq IS NOT NULL THEN apptreq
ELSE 'N'
END ) apptreq,
( CASE
WHEN apptmade IS NOT NULL THEN apptmade
ELSE 'N'
END ) apptmade,
( CASE
WHEN ununit IS NOT NULL THEN ununit
ELSE ' '
END ) UNUNIT,
( CASE
WHEN unsupr IS NOT NULL THEN unsupr
ELSE ' '
END ) asdrmgr,
( CASE
WHEN unfmgr IS NOT NULL THEN unfmgr
ELSE ' '
END ) asflmgr,
( CASE
WHEN untrl1 IS NOT NULL THEN untrl1
ELSE ' '
END ) UNTRL1
FROM iesqafile.opplan
LEFT OUTER JOIN iesqafile.order d
ON d.orodr# = opord#
LEFT OUTER JOIN ordermiles
ON mmord# = d.orodr#
LEFT OUTER JOIN firstequiprow
ON d.orodr# = oeord#
LEFT OUTER JOIN stopgroup
ON d.orodr# = stoporder
LEFT OUTER JOIN iesqafile.units
ON ununit = d.orpdrv

The first error is because in your 2 main SELECT statements (being UNIONed together) you have different column names - so the View doesn't know what to call them and is requiring you to explicitly name them e.g. the first column in each statement:
SELECT a.orodr# orodr_ ...
SELECT d.orodr# as ordddd ...
For the 2nd error, what is the datatype of the ORPTIM column?
I'm guessing that this type of construct is causing the issue:
CASE orptim
WHEN 0
THEN Varchar(0)
ELSE CONCAT(CONCAT(SUBSTRING(orptim, 1, 2), ':'), SUBSTRING(orptim, 3, 4))
If orptim is a number/decimal then "WHEN 0" will work but "SUBSTRING(orptim, 1, 2)" won't - as you can't substring a number. If orptim is a string then "WHEN 0" w=may be casuing problems.

Related

Why wont my temp table populate data but the select statement inside of it will?

I have been stuck on a problem that has been a huge blocker for me. I cant seem to wrap my head around this issue and I was hoping someone can help provide me with some guidance.
So my problem is when I create my temp table, and I do
select * from all_subs
I get a blank table. However, when I test to run the select statement that comprises the temp table I get results...
My query looks like this
drop table if exists all_subs;
select sdb.id as subscription_id,
sdb.created_at,
sdb.user_id as user_id,
sdb.is_gift as is_gift,
case when pl.sku like '%auto-cancel%' then 1 else 0 end as is_auto_cancel,
sdb.current_period_ends_at as current_period_ends_at,
sdb.expires_at as expires_at,
sdb.current_period_started_at as current_period_started_at,
case when sdb.expires_at is null then 0 else 1 end as expiring,
case when pl.sku ilike '%mobi1' then 1
when pl.sku ilike '%mobi6' then 6
when pl.sku ilike '%mobi12' then 12
else pl.duration end as duration,
sdb.dog_name as dog_name,
sdb.dog_birthday as dog_birthday,
pl.sku as sku,
cast(round(100.0 * pl.price, 0) as int) as price,
cast(round(100.0 * pl.price / pl.duration, 0) as int) as mrr,
case
when sdb.expires_at is null and getdate() between sdb.current_period_started_at and sdb.current_period_ends_at then 'active'
when sdb.expires_at > getdate() then 'canceled'
when sdb.expires_at <= getdate() or (sdb.expires_at is null and sdb.current_period_ends_at < date_add('day',-30,getdate())) then 'expired'
else 'unknown'
end as subscription_state,
coalesce(can.no_new_products, false) as no_new_products,
coalesce(can.dog_did_not_like, false) as dog_did_not_like,
coalesce(can.not_enough_value, false) as not_enough_value,
coalesce(can.dog_died, false) as dog_died,
coalesce(can.cant_afford, false) as cant_afford,
coalesce(can.offer_accepted, false) as offer_accepted,
coalesce(can.too_big_too_small, false) as too_big_too_small,
coalesce(can.allergies, false) as allergies,
coalesce(can.too_much_treats, false) as too_much_treats,
coalesce(can.too_few_toys, false) as too_few_toys,
coalesce(can.toy_durability, false) as toy_durability,
coalesce(can.new_address, false) as new_address,
coalesce(can.something_different, false) as something_different,
case when ais.subscription_id is not null then 1 else 0 end add_item,
case when eets.subscription_id is not null then 1 else 0 end ever_extra_toy,
case when sdb.allergies = '{""}' then 0
when sdb.allergies is null then 0
else 1 end as is_allergy,
min(s.shipped_at) first_box_shipped_at,
count(distinct case when s.shipped_at is not null then o.id end) shipped_orders,
cast((case when (sdb.expires_at <= getdate() or (sdb.expires_at is null and sdb.current_period_ends_at < date_add('day',-30,getdate())))
and count(distinct case when s.shipped_at is not null then o.id end) = 0 then 1 else 0 end) as boolean) is_killed
into temp all_subs
from subscriptions as sdb
left join subscription_cancellation_summary as can on can.subscription_id = sdb.id
left join plans as pl on pl.id = sdb.current_plan_id
left join add_item_subs ais on ais.subscription_id = sdb.id
left join ever_extra_toy_subs eets on eets.subscription_id = sdb.id
left join orders o on o.orderable_type = 'Subscription' and o.orderable_id = sdb.id
left join orders_shipments os on os.order_id = o.id
left join shipments s on s.id = os.shipment_id
left join common.subs_dim sd on sd.subscription_id = sdb.id
where
-- Only valid subscriptions
sd.is_killed = false
group by sdb.id,
sdb.created_at,
sdb.user_id,
sdb.is_gift,
case when pl.sku like '%auto-cancel%' then 1 else 0 end,
sdb.current_period_ends_at,
sdb.expires_at,
sdb.current_period_started_at,
case when sdb.expires_at is null then 0 else 1 end,
case when pl.sku ilike '%mobi1' then 1
when pl.sku ilike '%mobi6' then 6
when pl.sku ilike '%mobi12' then 12
else pl.duration end,
sdb.dog_name,
sdb.dog_birthday,
pl.sku,
cast(round(100.0 * pl.price, 0) as int),
cast(round(100.0 * pl.price / pl.duration, 0) as int),
case
when sdb.expires_at is null and getdate() between sdb.current_period_started_at and sdb.current_period_ends_at then 'active'
when sdb.expires_at > getdate() then 'canceled'
when sdb.expires_at <= getdate() or (sdb.expires_at is null and sdb.current_period_ends_at < date_add('day',-30,getdate())) then 'expired'
else 'unknown'
end,
coalesce(can.no_new_products, false),
coalesce(can.dog_did_not_like, false),
coalesce(can.not_enough_value, false),
coalesce(can.dog_died, false),
coalesce(can.cant_afford, false),
coalesce(can.offer_accepted, false),
coalesce(can.too_big_too_small, false),
coalesce(can.allergies, false),
coalesce(can.too_much_treats, false),
coalesce(can.too_few_toys, false),
coalesce(can.toy_durability, false),
coalesce(can.new_address, false),
coalesce(can.something_different, false),
case when ais.subscription_id is not null then 1 else 0 end,
case when eets.subscription_id is not null then 1 else 0 end,
case when sdb.allergies = '{""}' then 0
when sdb.allergies is null then 0
else 1 end;
Has anybody come across this issue? Please help!
Thank you very much in advance
Try changing the
into temp all_subs
to
INTO TEMP TABLE all_subs

Column invalid in select list because it is contained in either an aggregate function or the GROUP BY clause

I know similar questions have been covered for this topic, I've looked through the answers but I just can't work out how to apply to this query unfortunately.
I know that adding 'pe.short_name' to GROUP BY isn't the best way to handle this either.
Any suggestions very much appreciated..
Column 'pe.short_name' invalid in select list because it is contained
in either an aggregate function or the GROUP BY clause.`
SELECT CASE
WHEN SUBSTRING(s.description, 13, 1) = '.'
THEN LEFT(s.description, 17)
ELSE LEFT(s.description, 12)
END WBSCode
,pe.short_name
,pn.description ProjectName
,(
SELECT description
FROM structure
WHERE structure_code = pe.code346
) ActivePortfolio
,CASE
WHEN ast.Description = 'WAIO'
THEN anc.Description
ELSE site.Description
END SiteFunction
,CASE
WHEN SUBSTRING(jv.description, 5, 1) = ' '
THEN LEFT(jv.description, 4)
WHEN SUBSTRING(jv.description, 7, 1) = ' '
THEN LEFT(jv.description, 6)
ELSE jv.Description
END AS JointVenture
,(
SELECT description
FROM structure
WHERE structure_code = pe.code79
) AssetClassification
,(
SELECT description
FROM structure
WHERE structure_code = pe.code390
) InvestmentSize
,(
SELECT RIGHT(import_code, 6)
FROM structure
WHERE structure_code = pe.code79
) AssetClassCode
,CAST(p.period_start AS DATE) Period_Start
,SUM(CASE
WHEN be.currency_code = 'AUD'
AND #Currency = 'AUD'
THEN be.amount
WHEN be.currency_code = 'USD'
AND #Currency = 'USD'
THEN be.amount
WHEN be.currency_code = 'AUD'
AND #Currency = 'USD'
THEN be.amount * ip.pfn_exch_rate_on_date(p.period_start, be.currency_code)
WHEN be.currency_code = 'USD'
AND #Currency = 'AUD'
THEN be.amount * (ip.pfn_exch_rate_on_date(p.period_start, be.currency_code) / ip.pfn_exch_rate_on_date(p.period_start, 'AUD'))
END) Amount
FROM fm_budget_entry be
JOIN fm_period p ON be.period_id = p.period_id
JOIN fm_budget_line bl ON be.line_id = bl.line_id
AND bl.version_id = #FinancialVersion
JOIN fm_budget_line_attrib la ON la.line_id = bl.line_id
AND la.line_attrib_code = 'Wbs138'
JOIN structure s ON la.line_attrib_value = s.structure_code
JOIN fm_account fa ON bl.account_code = fa.account_code
JOIN planning_entity pe ON pe.planning_code = bl.structure_code
JOIN structure ast ON ast.structure_code = pe.code713
AND ast.Description IN (#Assets)
JOIN structure pn ON pn.structure_code = pe.planning_code
LEFT JOIN structure site ON site.structure_code = pe.code37
LEFT JOIN structure_tree tr ON tr.dsc_code = pe.planning_code
AND tr.anc_Depth = 5
LEFT JOIN structure anc ON anc.structure_code = tr.anc_code
LEFT JOIN fm_version v ON v.version_id = bl.version_id
LEFT JOIN structure pc ON pc.structure_code = s.father_code
LEFT JOIN structure jv ON pc.father_code = jv.structure_code
AND jv.father_code <> 'Wbs138Root'
WHERE fa.account_type_code IN (#FundingType)
AND p.period_id BETWEEN #StartDate
AND #FinishDate
AND pe.code346 IN (#ActivePortfolio)
GROUP BY CASE
WHEN SUBSTRING(s.description, 13, 1) = '.'
THEN LEFT(s.description, 17)
ELSE LEFT(s.description, 12)
END
,pn.description
,pe.code346
,CASE
WHEN ast.Description = 'WAIO'
THEN anc.Description
ELSE site.Description
END
,CASE
WHEN SUBSTRING(jv.description, 5, 1) = ' '
THEN LEFT(jv.description, 4)
WHEN SUBSTRING(jv.description, 7, 1) = ' '
THEN LEFT(jv.description, 6)
ELSE jv.Description
END
,pe.code79
,pe.code390
,CAST(p.period_start AS DATE)
ORDER BY 1
,CAST(p.period_start AS DATE)
Try this:
SELECT CASE
WHEN SUBSTRING(s.description, 13, 1) = '.'
THEN LEFT(s.description, 17)
ELSE LEFT(s.description, 12)
END WBSCode
,pe.short_name
,pn.description ProjectName
,(
SELECT description
FROM structure
WHERE structure_code = pe.code346
) ActivePortfolio
,CASE
WHEN ast.Description = 'WAIO'
THEN anc.Description
ELSE site.Description
END SiteFunction
,CASE
WHEN SUBSTRING(jv.description, 5, 1) = ' '
THEN LEFT(jv.description, 4)
WHEN SUBSTRING(jv.description, 7, 1) = ' '
THEN LEFT(jv.description, 6)
ELSE jv.Description
END AS JointVenture
,(
SELECT description
FROM structure
WHERE structure_code = pe.code79
) AssetClassification
,(
SELECT description
FROM structure
WHERE structure_code = pe.code390
) InvestmentSize
,(
SELECT RIGHT(import_code, 6)
FROM structure
WHERE structure_code = pe.code79
) AssetClassCode
,CAST(p.period_start AS DATE) Period_Start
,SUM(CASE
WHEN be.currency_code = 'AUD'
AND #Currency = 'AUD'
THEN be.amount
WHEN be.currency_code = 'USD'
AND #Currency = 'USD'
THEN be.amount
WHEN be.currency_code = 'AUD'
AND #Currency = 'USD'
THEN be.amount * ip.pfn_exch_rate_on_date(p.period_start, be.currency_code)
WHEN be.currency_code = 'USD'
AND #Currency = 'AUD'
THEN be.amount * (ip.pfn_exch_rate_on_date(p.period_start, be.currency_code) / ip.pfn_exch_rate_on_date(p.period_start, 'AUD'))
END) Amount
FROM fm_budget_entry be
JOIN fm_period p ON be.period_id = p.period_id
JOIN fm_budget_line bl ON be.line_id = bl.line_id
AND bl.version_id = #FinancialVersion
JOIN fm_budget_line_attrib la ON la.line_id = bl.line_id
AND la.line_attrib_code = 'Wbs138'
JOIN structure s ON la.line_attrib_value = s.structure_code
JOIN fm_account fa ON bl.account_code = fa.account_code
JOIN planning_entity pe ON pe.planning_code = bl.structure_code
JOIN structure ast ON ast.structure_code = pe.code713
AND ast.Description IN (#Assets)
JOIN structure pn ON pn.structure_code = pe.planning_code
LEFT JOIN structure site ON site.structure_code = pe.code37
LEFT JOIN structure_tree tr ON tr.dsc_code = pe.planning_code
AND tr.anc_Depth = 5
LEFT JOIN structure anc ON anc.structure_code = tr.anc_code
LEFT JOIN fm_version v ON v.version_id = bl.version_id
LEFT JOIN structure pc ON pc.structure_code = s.father_code
LEFT JOIN structure jv ON pc.father_code = jv.structure_code
AND jv.father_code <> 'Wbs138Root'
WHERE fa.account_type_code IN (#FundingType)
AND p.period_id BETWEEN #StartDate
AND #FinishDate
AND pe.code346 IN (#ActivePortfolio)
GROUP BY CASE
WHEN SUBSTRING(s.description, 13, 1) = '.'
THEN LEFT(s.description, 17)
ELSE LEFT(s.description, 12)
END
,pe.short_name
,pn.description
,pe.code346
,CASE
WHEN ast.Description = 'WAIO'
THEN anc.Description
ELSE site.Description
END
,CASE
WHEN SUBSTRING(jv.description, 5, 1) = ' '
THEN LEFT(jv.description, 4)
WHEN SUBSTRING(jv.description, 7, 1) = ' '
THEN LEFT(jv.description, 6)
ELSE jv.Description
END
,pe.code79
,pe.code390
,CAST(p.period_start AS DATE)
ORDER BY 1
,CAST(p.period_start AS DATE)

The multi-part identifier could not be bound sql error

I have taken over the support of an Excel 2010 macro and need to change the sort order of a recordset.
The query below worked before I attempted to change the order by adding rl.list_order.
Now I'm getting the error "The multi-part identifier could not be bound" and have tried many alternatives and have researched on this site for a solution but haven't been able to solve this. Can someone please help.
SELECT ips_rc.project, lfbe.Category, ips_rc.roster_id, ips_rc.role_category, ips_rc.role_title AS Role, ips_rc.role_code, ips_rc.role_title + ' (' + ips_rc.role_code + ')' AS PS_Role, CASE WHEN ISNULL(lfbe.Pronto_Role_Code, '') = '' THEN 'TO_BE_MAPPED' ELSE ISNULL(lfbe.Pronto_Role_Code, '') END AS Pronto_Role_Code, CASE WHEN ISNULL(lfbe.Pronto_Role_Code_Description, '') = '' THEN ips_rc.role_title ELSE ISNULL(lfbe.Pronto_Role_Code_Description, '') END AS Pronto_Role_Code_Description, ISNULL(lfbe.Rate, 0) AS Rate, CASE WHEN ISNULL(lfbe.Pronto_Role_Code_Old, '') = '' THEN ips_rc.role_title ELSE lfbe.Pronto_Role_Code_Old END AS Pronto_Role_Code_Old, CASE WHEN ISNULL(lfbe.Pronto_Role_Code_Description_Old, '') = '' THEN 'TO_BE_MAPPED' ELSE lfbe.Pronto_Role_Code_Description_Old END AS Pronto_Role_Code_Description_Old, ips_rc.Shift, ips_rc.UOM, ips_rc.Date, ips_rc.DHours, ips_rc.NHours FROM (SELECT psrc.project, pr_jcm.customer, pr_jcm.subcode, psrc.roster_id, psrc.role_id, psrc.role_category, psrc.role_title,
psrc.role_code, CASE WHEN SUM(CASE WHEN psrc.Date BETWEEN psrc.start_date AND psrc.end_date THEN psrc.NWorkHours ELSE 0 END) OVER (PARTITION BY psrc.project, psrc.roster_id) >= SUM(CASE WHEN psrc.Date BETWEEN psrc.start_date AND psrc.end_date THEN psrc.DWorkHours ELSE 0 END) OVER (PARTITION BY psrc.project, psrc.roster_id) THEN 'Night Shifts' ELSE 'Day Shifts' END AS Shift, 'HOURS' AS UOM, psrc.Date, psrc.DHours, psrc.NHours FROM (SELECT rcd.project, rcd.start_date, rcd.end_date, rcd.roster_id, rcd.role1_id AS role_id, CASE WHEN rb_test1.role1_id IS NOT NULL THEN rb_test1.category WHEN rb_test2.role1_id IS NOT NULL THEN rb_test2.category WHEN rb_test3.role1_id IS NOT NULL THEN rb_test3.category ELSE rcd.role_category END AS role_category, CASE WHEN rb_test1.role1_id IS NOT NULL THEN rb_test1.title WHEN rb_test2.role1_id IS NOT NULL THEN rb_test2.title WHEN rb_test3.role1_id IS NOT NULL THEN rb_test3.title ELSE rcd.role_title END AS role_title, CASE WHEN rb_test1.role1_id IS NOT NULL THEN CAST(rb_test1.band_r
ole_id AS VARCHAR) WHEN rb_test2.role1_id IS NOT NULL THEN CAST(rb_test2.band_role_id AS VARCHAR) WHEN rb_test3.role1_id IS NOT NULL THEN CAST(rb_test3.band_role_id AS VARCHAR) ELSE rcd.role_code END AS role_code, rcd.shift_date AS Date, SUM(CASE WHEN rcd.shift_ampm = 'day' THEN rcd.shift_time ELSE 0 END) AS DHours, SUM(CASE WHEN rcd.shift_ampm = 'day' AND rcd.shift_type = 'work' THEN rcd.shift_time ELSE 0 END) AS DWorkHours, SUM(CASE WHEN rcd.shift_ampm = 'day' AND rcd.shift_type = 'eqmob' THEN rcd.shift_time ELSE 0 END) AS DEqmobHours, SUM(CASE WHEN rcd.shift_ampm = 'day' AND rcd.shift_type = 'eqdemob' THEN rcd.shift_time ELSE 0 END) AS DEqdemobHours, SUM(CASE WHEN rcd.shift_ampm = 'night' THEN rcd.shift_time ELSE 0 END) AS NHours, SUM(CASE WHEN rcd.shift_ampm = 'night' AND rcd.shift_type = 'work' THEN rcd.shift_time ELSE 0 END) AS NWorkHours, SUM(CASE WHEN rcd.shift_ampm = 'night' AND rcd.shift_type = 'eqmob' THEN rcd.shift_time ELSE 0 END) AS NEqmobHours, SUM(CASE WHEN rcd.shift_ampm = 'night' AND rcd.sh
ift_type = 'eqdemob' THEN rcd.shift_time ELSE 0 END) AS NEqdemobHours FROM OPENQUERY([LFMANAGE], 'SELECT p.job_no AS project, p.start_date, p.end_date, rs.roster_id, IFNULL(rs.role_id, 0) AS role1_id, IFNULL(r.role2_id, 0) AS role2_id, IFNULL(r.role3_id, 0) AS role3_id, rl.category AS role_category, rl.title AS role_title, rl.role_code AS role_code, rs.shift_date, rs.shift_ampm, rs.shift_time, rs.shift_type, s.client_id FROM lfmanage.t_roster_shift rs JOIN lfmanage.t_project AS p ON p.project_id = rs.project_id LEFT JOIN lfmanage.t_site AS s ON s.site_id = p.site_id JOIN lfmanage.t_roster AS r ON r.roster_id = rs.roster_id JOIN lfmanage.t_role AS rl ON rl.role_id = rs.role_id WHERE p.job_no = ''700704'' AND CASE WHEN ISNULL(rs.deleted) THEN 0 ELSE rs.deleted END = 0') AS rcd LEFT OUTER JOIN (SELECT client_id, band_role_id, title, CASE WHEN CHARINDEX(UPPER(title),'SUPER') > 0 THEN 'super' ELSE 'trade' END AS category, role1_id, role2_id, role3_id FROM OPENQUERY([LFMANAGE], 'SELECT br.client_id, MIN(brs.band_r
ole_id) AS band_role_id, br.title, brs.role1_id, brs.role2_id, brs.role3_id FROM t_band_role_set AS brs INNER JOIN t_band_role AS br ON br.band_role_id = brs.band_role_id WHERE IFNULL(brs.role1_id, 0) <> 0 AND IFNULL(brs.role2_id, 0) <> 0 AND IFNULL(brs.role3_id, 0) <> 0 GROUP BY br.client_id, br.title, brs.role1_id, brs.role2_id, brs.role3_id')) AS rb_test1 ON rb_test1.client_id = rcd.client_id AND rb_test1.role1_id = rcd.role1_id AND rb_test1.role2_id = rcd.role2_id AND rb_test1.role3_id = rcd.role3_id LEFT OUTER JOIN (SELECT client_id, band_role_id, title, CASE WHEN CHARINDEX(UPPER(title),'SUPER') > 0 THEN 'super' ELSE 'trade' END AS category, role1_id, role2_id FROM OPENQUERY([LFMANAGE], 'SELECT br.client_id, MIN(brs.band_role_id) AS band_role_id, br.title, brs.role1_id, brs.role2_id FROM t_band_role_set AS brs INNER JOIN t_band_role AS br ON br.band_role_id = brs.band_role_id WHERE IFNULL(brs.role1_id, 0) <> 0 AND IFNULL(brs.role2_id, 0) <> 0 GROUP BY br.client_id, br.title, brs.role1_id, brs.role2_id '
)) AS rb_test2 ON rb_test2.client_id = rcd.client_id AND rb_test2.role1_id = rcd.role1_id AND rb_test2.role2_id = rcd.role2_id LEFT OUTER JOIN (SELECT client_id, band_role_id, title, CASE WHEN CHARINDEX(UPPER(title),'SUPER') > 0 THEN 'super' ELSE 'trade' END AS category, role1_id, role3_id FROM OPENQUERY([LFMANAGE], 'SELECT br.client_id, MIN(brs.band_role_id) AS band_role_id, br.title, brs.role1_id, brs.role3_id FROM t_band_role_set AS brs INNER JOIN t_band_role AS br ON br.band_role_id = brs.band_role_id WHERE IFNULL(brs.role1_id, 0) <> 0 AND IFNULL(brs.role3_id, 0) <> 0 GROUP BY br.client_id, br.title, brs.role1_id, brs.role3_id ')) AS rb_test3 ON rb_test3.client_id = rcd.client_id AND rb_test3.role1_id = rcd.role1_id AND rb_test3.role3_id = rcd.role3_id WHERE rcd.shift_date > '2017-01-01' GROUP BY rcd.project, rcd.start_date, rcd.end_date, rcd.roster_id, rcd.role1_id, CASE WHEN rb_test1.role1_id IS NOT NULL THEN rb_test1.category WHEN rb_test2.role1_id IS NOT NULL THEN rb_test2.category WHEN rb_test3.role
1_id IS NOT NULL THEN rb_test3.category ELSE rcd.role_category END, CASE WHEN rb_test1.role1_id IS NOT NULL THEN rb_test1.title WHEN rb_test2.role1_id IS NOT NULL THEN rb_test2.title WHEN rb_test3.role1_id IS NOT NULL THEN rb_test3.title ELSE rcd.role_title END, CASE WHEN rb_test1.role1_id IS NOT NULL THEN CAST(rb_test1.band_role_id AS VARCHAR) WHEN rb_test2.role1_id IS NOT NULL THEN CAST(rb_test2.band_role_id AS VARCHAR) WHEN rb_test3.role1_id IS NOT NULL THEN CAST(rb_test3.band_role_id AS VARCHAR) ELSE rcd.role_code END, rcd.shift_date) AS psrc INNER JOIN (SELECT job_no AS project, Client AS customer, '3700002213' AS subcode FROM [dbo].[vw_PlanningSystem_Projects] WHERE job_no = '700704') AS pr_jcm ON pr_jcm.project = psrc.project) AS ips_rc LEFT OUTER JOIN (SELECT rates.Client, rates.SubCode, mapping.Category, mapping.Shift, mapping.IPS_Role_Code, rates.Pronto_Role_Code, rates.Pronto_Role_Code_Description, rates.Rate, rates.Pronto_Role_Code_Old, rates.Pronto_Role_Code_Description_Old FROM (SELECT UPPER(Ca
tegory) AS Category, 'Day Shifts' AS Shift, IPS_Role_Code, Day_Cost_Code As Pronto_Role_Code FROM [LFBudgetEstimate].[dbo].[LFBE_RoleCode_MasterMapping] UNION ALL SELECT UPPER(Category) AS Category, 'Night Shifts' AS Shift, IPS_Role_Code, Night_Cost_Code As Pronto_Role_Code FROM [LFBudgetEstimate].[dbo].[LFBE_RoleCode_MasterMapping]) AS mapping INNER JOIN (SELECT Client, SubCode, CASE WHEN Shift = 'Day Shift' THEN 'Day Shifts' WHEN Shift = 'Night Shift' THEN 'Night Shifts' Else '' END AS Shift, Pronto_Role_Code, Pronto_Role_Code_Description, Rate, Pronto_Role_Code_Old, Pronto_Role_Code_Description_Old FROM [LFBudgetEstimate].[dbo].[LFBE_SubCodes_Rates]) AS rates ON rates.Shift = mapping.Shift AND rates.Pronto_Role_Code = mapping.Pronto_Role_Code) AS lfbe ON lfbe.Client = ips_rc.customer AND lfbe.SubCode = ips_rc.subCode AND lfbe.Shift = ips_rc.Shift AND lfbe.IPS_Role_Code = ips_rc.role_code ORDER BY ips_rc.project ASC, ips_rc.role_title ASC, rl.list_order
Thanks for your help
Even with the formatting, you've got a lot going on here... Stack Overflow veterans, I'm just starting to dip my toes in here, so if this isn't correct, give me some grace.
In your first OPENQUERY statement, I don't see rl.list_order as a field being returned. If that's a column you're trying to ORDER BY, I think you should be able to add rl.list_order to your SELECT list within that statement which you alias as rcd.
Since that's within a nested sub-query, you'll want to elevate it to each of the calling queries. I think it's something like this... Try it out and post back with any errors.
SELECT ips_rc.ListOrder
, ips_rc.project
, lfbe.Category
, ips_rc.roster_id
, ips_rc.role_category
, ips_rc.role_title AS [ROLE]
, ips_rc.role_code
, ips_rc.role_title + ' (' + ips_rc.role_code + ')' AS PS_Role
, CASE
WHEN ISNULL(lfbe.Pronto_Role_Code, '') = ''
THEN 'TO_BE_MAPPED'
ELSE ISNULL(lfbe.Pronto_Role_Code, '')
END AS Pronto_Role_Code
, CASE
WHEN ISNULL(lfbe.Pronto_Role_Code_Description, '') = ''
THEN ips_rc.role_title
ELSE ISNULL(lfbe.Pronto_Role_Code_Description, '')
END AS Pronto_Role_Code_Description
, ISNULL(lfbe.Rate, 0) AS Rate
, CASE
WHEN ISNULL(lfbe.Pronto_Role_Code_Old, '') = ''
THEN ips_rc.role_title
ELSE lfbe.Pronto_Role_Code_Old
END AS Pronto_Role_Code_Old
, CASE
WHEN ISNULL(lfbe.Pronto_Role_Code_Description_Old, '') = ''
THEN 'TO_BE_MAPPED'
ELSE lfbe.Pronto_Role_Code_Description_Old
END AS Pronto_Role_Code_Description_Old
, ips_rc.Shift
, ips_rc.UOM
, ips_rc.DATE
, ips_rc.DHours
, ips_rc.NHours
FROM (
SELECT psrc.ListOrder -- Added
, psrc.project
, pr_jcm.customer
, pr_jcm.subcode
, psrc.roster_id
, psrc.role_id
, psrc.role_category
, psrc.role_title
, psrc.role_code
, CASE
WHEN SUM(CASE
WHEN psrc.DATE BETWEEN psrc.start_date
AND psrc.end_date
THEN psrc.NWorkHours
ELSE 0
END) OVER (PARTITION BY psrc.project, psrc.roster_id) >= SUM(CASE
WHEN psrc.DATE BETWEEN psrc.start_date
AND psrc.end_date
THEN psrc.DWorkHours
ELSE 0
END) OVER (PARTITION BY psrc.project, psrc.roster_id)
THEN 'Night Shifts'
ELSE 'Day Shifts'
END AS Shift, 'HOURS' AS UOM, psrc.DATE, psrc.DHours, psrc.NHours
FROM (
SELECT rcd.list_order --Added
, rcd.project
, rcd.start_date
, rcd.end_date
, rcd.roster_id
, rcd.role1_id AS role_id
, CASE
WHEN rb_test1.role1_id IS NOT NULL
THEN rb_test1.category
WHEN rb_test2.role1_id IS NOT NULL
THEN rb_test2.category
WHEN rb_test3.role1_id IS NOT NULL
THEN rb_test3.category
ELSE rcd.role_category
END AS role_category
, CASE
WHEN rb_test1.role1_id IS NOT NULL
THEN rb_test1.title
WHEN rb_test2.role1_id IS NOT NULL
THEN rb_test2.title
WHEN rb_test3.role1_id IS NOT NULL
THEN rb_test3.title
ELSE rcd.role_title
END AS role_title
, CASE
WHEN rb_test1.role1_id IS NOT NULL
THEN CAST(rb_test1.band_role_id AS VARCHAR)
WHEN rb_test2.role1_id IS NOT NULL
THEN CAST(rb_test2.band_role_id AS VARCHAR)
WHEN rb_test3.role1_id IS NOT NULL
THEN CAST(rb_test3.band_role_id AS VARCHAR)
ELSE rcd.role_code
END AS role_code, rcd.shift_date AS DATE
, SUM(CASE
WHEN rcd.shift_ampm = 'day'
THEN rcd.shift_time
ELSE 0
END) AS DHours
, SUM(CASE
WHEN rcd.shift_ampm = 'day'
AND rcd.shift_type = 'work'
THEN rcd.shift_time
ELSE 0
END) AS DWorkHours
, SUM(CASE
WHEN rcd.shift_ampm = 'day'
AND rcd.shift_type = 'eqmob'
THEN rcd.shift_time
ELSE 0
END) AS DEqmobHours
, SUM(CASE
WHEN rcd.shift_ampm = 'day'
AND rcd.shift_type = 'eqdemob'
THEN rcd.shift_time
ELSE 0
END) AS DEqdemobHours
, SUM(CASE
WHEN rcd.shift_ampm = 'night'
THEN rcd.shift_time
ELSE 0
END) AS NHours
, SUM(CASE
WHEN rcd.shift_ampm = 'night'
AND rcd.shift_type = 'work'
THEN rcd.shift_time
ELSE 0
END) AS NWorkHours
, SUM(CASE
WHEN rcd.shift_ampm = 'night'
AND rcd.shift_type = 'eqmob'
THEN rcd.shift_time
ELSE 0
END) AS NEqmobHours
, SUM(CASE
WHEN rcd.shift_ampm = 'night'
AND rcd.shift_type = 'eqdemob'
THEN rcd.shift_time
ELSE 0
END) AS NEqdemobHours
FROM OPENQUERY([LFMANAGE], 'SELECT p.job_no AS project, p.start_date, p.end_date, rs.roster_id, IFNULL(rs.role_id, 0) AS role1_id, IFNULL(r.role2_id, 0) AS role2_id, IFNULL(r.role3_id, 0) AS role3_id, rl,ListOrder, rl.category AS role_category, rl.title AS role_title, rl.role_code AS role_code, rs.shift_date, rs.shift_ampm, rs.shift_time, rs.shift_type, s.client_id FROM lfmanage.t_roster_shift rs JOIN lfmanage.t_project AS p ON p.project_id = rs.project_id LEFT JOIN lfmanage.t_site AS s ON s.site_id = p.site_id JOIN lfmanage.t_roster AS r ON r.roster_id = rs.roster_id JOIN lfmanage.t_role AS rl ON rl.role_id = rs.role_id WHERE p.job_no = ''700704'' AND CASE WHEN ISNULL(rs.deleted) THEN 0 ELSE rs.deleted END = 0') AS rcd --Added
LEFT JOIN (
SELECT client_id
, band_role_id
, title
, CASE
WHEN CHARINDEX(UPPER(title), 'SUPER') > 0
THEN 'super'
ELSE 'trade'
END AS category
, role1_id
, role2_id
, role3_id
FROM OPENQUERY([LFMANAGE], 'SELECT br.client_id, MIN(brs.band_role_id) AS band_role_id, br.title, brs.role1_id, brs.role2_id, brs.role3_id FROM t_band_role_set AS brs INNER JOIN t_band_role AS br ON br.band_role_id = brs.band_role_id WHERE IFNULL(brs.role1_id, 0) <> 0 AND IFNULL(brs.role2_id, 0) <> 0 AND IFNULL(brs.role3_id, 0) <> 0 GROUP BY br.client_id, br.title, brs.role1_id, brs.role2_id, brs.role3_id')
) AS rb_test1
ON rb_test1.client_id = rcd.client_id
AND rb_test1.role1_id = rcd.role1_id
AND rb_test1.role2_id = rcd.role2_id
AND rb_test1.role3_id = rcd.role3_id
LEFT JOIN (
SELECT client_id, band_role_id, title, CASE
WHEN CHARINDEX(UPPER(title), 'SUPER') > 0
THEN 'super'
ELSE 'trade'
END AS category, role1_id, role2_id
FROM OPENQUERY([LFMANAGE], 'SELECT br.client_id, MIN(brs.band_role_id) AS band_role_id, br.title, brs.role1_id, brs.role2_id FROM t_band_role_set AS brs INNER JOIN t_band_role AS br ON br.band_role_id = brs.band_role_id WHERE IFNULL(brs.role1_id, 0) <> 0 AND IFNULL(brs.role2_id, 0) <> 0 GROUP BY br.client_id, br.title, brs.role1_id, brs.role2_id ')
) AS rb_test2
ON rb_test2.client_id = rcd.client_id
AND rb_test2.role1_id = rcd.role1_id
AND rb_test2.role2_id = rcd.role2_id
LEFT JOIN (
SELECT client_id, band_role_id, title, CASE
WHEN CHARINDEX(UPPER(title), 'SUPER') > 0
THEN 'super'
ELSE 'trade'
END AS category, role1_id, role3_id
FROM OPENQUERY([LFMANAGE], 'SELECT br.client_id, MIN(brs.band_role_id) AS band_role_id, br.title, brs.role1_id, brs.role3_id FROM t_band_role_set AS brs INNER JOIN t_band_role AS br ON br.band_role_id = brs.band_role_id WHERE IFNULL(brs.role1_id, 0) <> 0 AND IFNULL(brs.role3_id, 0) <> 0 GROUP BY br.client_id, br.title, brs.role1_id, brs.role3_id ')
) AS rb_test3
ON rb_test3.client_id = rcd.client_id
AND rb_test3.role1_id = rcd.role1_id
AND rb_test3.role3_id = rcd.role3_id
WHERE rcd.shift_date > '2017-01-01'
GROUP BY rcd.list_order --Added
, rcd.project
, rcd.start_date
, rcd.end_date
, rcd.roster_id
, rcd.role1_id
, CASE
WHEN rb_test1.role1_id IS NOT NULL
THEN rb_test1.category
WHEN rb_test2.role1_id IS NOT NULL
THEN rb_test2.category
WHEN rb_test3.ROLE1_id IS NOT NULL
THEN rb_test3.category
ELSE rcd.role_category
END
, CASE
WHEN rb_test1.role1_id IS NOT NULL
THEN rb_test1.title
WHEN rb_test2.role1_id IS NOT NULL
THEN rb_test2.title
WHEN rb_test3.role1_id IS NOT NULL
THEN rb_test3.title
ELSE rcd.role_title
END
, CASE
WHEN rb_test1.role1_id IS NOT NULL
THEN CAST(rb_test1.band_role_id AS VARCHAR)
WHEN rb_test2.role1_id IS NOT NULL
THEN CAST(rb_test2.band_role_id AS VARCHAR)
WHEN rb_test3.role1_id IS NOT NULL
THEN CAST(rb_test3.band_role_id AS VARCHAR)
ELSE rcd.role_code
END
, rcd.shift_date
) AS psrc
INNER JOIN (
SELECT job_no AS project
, Client AS customer
, '3700002213' AS subcode
FROM [dbo].[vw_PlanningSystem_Projects]
WHERE job_no = '700704'
) AS pr_jcm
ON pr_jcm.project = psrc.project
) AS ips_rc
LEFT JOIN (
SELECT rates.Client
, rates.SubCode
, mapping.Category
, mapping.Shift
, mapping.IPS_Role_Code
, rates.Pronto_Role_Code
, rates.Pronto_Role_Code_Description
, rates.Rate
, rates.Pronto_Role_Code_Old
, rates.Pronto_Role_Code_Description_Old
FROM (
SELECT UPPER(Category) AS Category
, 'Day Shifts' AS Shift
, IPS_Role_Code
, Day_Cost_Code AS Pronto_Role_Code
FROM [LFBudgetEstimate].[dbo].[LFBE_RoleCode_MasterMapping]
UNION ALL
SELECT UPPER(Category) AS Category
, 'Night Shifts' AS Shift
, IPS_Role_Code
, Night_Cost_Code AS Pronto_Role_Code
FROM [LFBudgetEstimate].[dbo].[LFBE_RoleCode_MasterMapping]
) AS mapping
INNER JOIN (
SELECT Client
, SubCode
, CASE
WHEN Shift = 'Day Shift'
THEN 'Day Shifts'
WHEN Shift = 'Night Shift'
THEN 'Night Shifts'
ELSE ''
END AS Shift
, Pronto_Role_Code
, Pronto_Role_Code_Description
, Rate
, Pronto_Role_Code_Old
, Pronto_Role_Code_Description_Old
FROM [LFBudgetEstimate].[dbo].[LFBE_SubCodes_Rates]
) AS rates
ON rates.Shift = mapping.Shift
AND rates.Pronto_Role_Code = mapping.Pronto_Role_Code
) AS lfbe
ON lfbe.Client = ips_rc.customer
AND lfbe.SubCode = ips_rc.subCode
AND lfbe.Shift = ips_rc.Shift
AND lfbe.IPS_Role_Code = ips_rc.role_code
ORDER BY ips_rc.project ASC, ips_rc.role_title ASC, ips_rc.list_order ASC
You're right CSharp821 there's an awful lot going on there. I made the changes you suggested and it now works!
You are trying to access alias rl, however the rl alias is only visible within the OPENQUERY which has an alias of rcd. Try order by rcd.list_order instead of rl.list_order

Concatenating multiple CASE statements into one alias

After some previous help on how to approach a problem I am having with some legacy code, it seems like the best approach for my issue is to concatenate case statements to return a value I can parse out in PHP.
I am trying to do something like this, but it is returning many rows, and eventually getting this error:
Maximum stored procedure, function, trigger, or view nesting level
exceeded (limit 32).
SELECT org.org_id,
org.org_name_1,
Datename(YEAR, member.enroll_date) AS enroll_year,
Max(CASE
WHEN board.member_from IS NULL THEN 0
ELSE 1
END) AS board_member,
CASE
WHEN ( org.delete_reason = 'OUT'
AND org.org_delete_flag = 'Y'
AND org.org_status_flag = 'C' ) THEN 'out_of_business|'
ELSE ''
END + CASE
WHEN ( stat.carrier = 'BS'
AND stat.status_id IS NOT NULL
AND stat.termination_date IS NULL
AND stat.flat_dues > 0 ) THEN 'insurance_member|'
ELSE ''
END + CASE
WHEN ( stat.carrier = 'BS'
AND stat.status_id IS NOT NULL
AND stat.termination_date IS NULL
AND stat.flat_dues = 0
AND member.status_flag IN( 'C', 'P' ) ) THEN 'insurance_product|'
ELSE ''
END + CASE
WHEN ( member.enroll_date IS NOT NULL
AND member.status_flag NOT IN( 'C', 'P' ) ) THEN 'member_since|'
ELSE ''
END + CASE
WHEN ( org.org_relationship_parent = 'Y'
AND org.dues_category = 'MBR'
AND org.org_status_flag = 'R' ) THEN 'subsidiary_member|'
ELSE ''
END + CASE
WHEN ( org.org_misc_data_9 = 'PAC' ) THEN 'pac|'
ELSE ''
END + CASE
WHEN ( org.dues_category = 'PART' ) THEN 'partner_member|'
ELSE ''
END + CASE
WHEN ( org.dues_category = 'FREE'
AND org.org_status_flag = 'P' ) THEN 'associate_member|'
ELSE ''
END
--ELSE 'non_member'
--END
AS org_status,
60 AS expires_in,
CASE
WHEN stat.dues_type = 'M' THEN
CASE
WHEN ( stat.termination_date IS NULL ) THEN ( stat.flat_dues )
ELSE 0
END
ELSE
CASE
WHEN ( member.payments = 0 ) THEN member.dues_billed_annual
ELSE member.payments
END
END AS dues_level,
CASE
WHEN ( org.affiliate_code = 'PCCE'
AND org.dues_category = 'MBR'
AND org.org_status_flag = 'R' ) THEN 1
ELSE 0
END AS pcce_membr,
-- '$'+CONVERT(VARCHAR,#dues) AS dues_level,
Ltrim(#product_level) AS product_level,
Ltrim(#involve_level) AS involvement_level
FROM organiz AS org
LEFT JOIN affilbil AS member
ON member.status_id = org.org_id
AND member.dues_category = 'MBR'
LEFT JOIN individu AS ind
ON ind.org_id = org.org_id
LEFT JOIN commembr AS board
ON board.status_id = ind.ind_id
AND board.committee_code = '5'
AND board.member_to IS NULL
LEFT JOIN statinsmorn AS stat
ON stat.status_id = org.org_id
AND stat.carrier = 'BS'
AND stat.planz = 'PCI'
WHERE org.org_id = #org_id
GROUP BY org.org_id,
org.org_name_1,
member.enroll_date,
org.delete_reason,
org.org_status_flag,
org.org_delete_flag,
stat.status_id,
stat.flat_dues,
stat.dues_type,
stat.termination_date,
org.org_misc_data_9,
org_relationship_parent,
org.dues_category,
member.status_flag,
member.dues_billed_annual,
member.payments,
stat.carrier,
org.Affiliate_Code
Well, this is embarrassing.
When I was making my changes to the stored procedure, I had inadvertently placed a call to the same procedure at the bottom. So I was recursively calling the same procedure over and over again. DOH.

SQL Set Column Equal to Value

I have the following query. I need Description to be set to the value of the long statement in the middle - the part beginning with CONVERT and ending with [Description]. The query I have now runs but the value of Description in the result is always NULL. Any ideas?
select s.SectionId,
s.Academic_Year [AcademicYear],
s.Academic_Term [AcademicTerm],
s.Academic_Session [AcademicSession],
s.Event_Id [EventId],
s.Event_Sub_Type [EventSubType],
s.Section [Section],
s.Event_Long_Name [EventLongName],
e.Description [EventDescription],
CONVERT(varchar(MAX), S.DESCRIPTION)
+ '<br /><br /><a href="http://www.bkstr.com/webapp/wcs/stores/servlet/booklookServlet?bookstore_id-1=044&term_id-1='
+ CASE S.ACADEMIC_TERM
WHEN 'SPRING' THEN 'SPRING'
WHEN 'SUMMER' THEN 'SUM'
WHEN 'FALL' THEN 'FALL'
WHEN 'J TERM' THEN 'J TERM'
ELSE 'ADV'
END
+ S.ACADEMIC_YEAR + '/' +
CASE S.ACADEMIC_SESSION
WHEN '01' THEN '1'
WHEN '02' THEN '2'
WHEN '03' THEN '3'
END
+ '&div-1=HILB&dept-1=' + SUBSTRING(S.EVENT_ID, 1, CHARINDEX(' ', S.EVENT_ID) - 1) + '&course-1=' + SUBSTRING(S.EVENT_ID, CHARINDEX(' ', S.EVENT_ID) + 1,
LEN(S.EVENT_ID)) + '&section-1=' + CONVERT(varchar(2), S.SECTION) + '" target=' + '"_blank">View Book Information</a>' [Description],
cest.Medium_Desc [SubTypeDescription],
s.Credits [Credits],
cge.Medium_Desc [GeneralEd],
s.Start_Date [StartDate],
s.End_Date [EndDate],
s.Max_Participant [MaximumParticipants],
s.Adds [AddCount],
s.Wait_List [WaitlistCount],
s.Sec_Enroll_Status [EnrollmentStatus],
o.Org_Name_1 [CampusName],
cp.Medium_Desc [ProgramDescription],
cc.Medium_Desc [CollegeDescription],
cd.Medium_Desc [DepartmentDescription],
ccm.Medium_Desc [CurriculumDescription],
ccl.Medium_Desc [ClassLevelDescription],
nt.Nontrad_Med_Name [NonTraditionalDescription],
cpn.Medium_Desc [PopulationDescription],
case s.Other_Org when 'N' then 0 else s.Other_Org_Part end as [CampusOtherLimit],
case s.Other_Program when 'N' then 0 else s.Other_Program_Part end as [ProgramOtherLimit],
case s.Other_College when 'N' then 0 else s.Other_College_Part end as [CollegeOtherLimit],
case s.Other_Department when 'N' then 0 else s.Other_Dept_Part end as [DepartmentOtherLimit],
case s.Other_Curriculum when 'N' then 0 else s.Other_Curric_Part end as [CurriculumOtherLimit],
case s.Other_Class_Level when 'N' then 0 else s.Other_CLevel_Part end as [ClassLevelOtherLimit],
case s.Other_NonTrad when 'N' then 0 else s.Other_NonTrad_Part end as [NonTraditionalOtherLimit],
case s.Other_Population when 'N' then 0 else s.Other_Pop_Part end as [PopulationOtherLimit],
s.Other_Org_Add as [CampusOtherRegistered],
s.Other_Program_Add as [ProgramOtherRegistered],
s.Other_College_Add as [CollegeOtherRegistered],
s.Other_Dept_Add as [DepartmentOtherRegistered],
s.Other_Curr_Add as [CurriculumOtherRegistered],
s.Other_CLevel_Add as [ClassLevelOtherRegistered],
s.Other_Nontrad_Add as [NonTraditionalOtherRegistered],
s.Other_Pop_Add as [PopulationOtherRegistered],
case s.Registration_Type when 'TRAD' then 0 else 1 end as [IsConEd],
cat.Medium_Desc [TermDescription],
cas.Medium_Desc [SessionDescription],
s.Credit_Type [DefaultCreditType],
cct.Medium_Desc [CreditTypeDescription]
from sections s
left join code_eventsubtype cest on cest.code_value_key = s.event_sub_type
left join code_generaled cge on cge.code_value_key = s.general_ed
left join event e on e.event_id = s.event_id
left join organization o on o.org_code_id = s.org_code_id
left join code_program cp on cp.code_value_key = s.program
left join code_college cc on cc.code_value_key = s.college
left join code_department cd on cd.code_value_key = s.department
left join code_curriculum ccm on ccm.code_value_key = s.curriculum
left join code_classlevel ccl on ccl.code_value_key = s.class_level
left join nontraditional nt on nt.nontrad_program = s.nontrad_program
left join code_population cpn on cpn.code_value_key = s.population
left join code_acaterm cat on cat.code_value_key = s.academic_term
left join code_acasession cas on cas.code_value_key = s.academic_session
left join code_acacredittype cct on cct.code_value_key = s.credit_type
One of your inputs must be NULL.
You can probably solve this by identifying which it is and using COALESCE or ISNULL:
COALESCE(x, '')
ISNULL(x, '')
COALESCE is the standard ANSI way, ISNULL gives slightly better performance (although the difference is probably insignificant in most cases).