declare @header table (sort int, description varchar(50));
declare @dates table (date datetime, sort int);
declare @services table (code varchar(50), sort int);
declare @glcodes table (id int, code varchar(50), name varchar(50), coef int, sort int);
declare @locations table (id int, code varchar(10), name varchar(50), sort int);
declare @orders table (
ID int,
Location int,
Sale money,
Discount money,
Tax money,
Date datetime
);
declare @glcodesdiscounts table (glcodesort int, locationsort int, datesort int, Amount money);
declare @glcodessales table (glcodesort int, locationsort int, datesort int, Amount money);
declare @servicemoney table (servicesort int, locationsort int, datesort int, Amount money);
declare @ordermoney table (locationsort int, datesort int, Sale money, Discount money, Tax money);
select
ld.locationsort,
ld.datesort,
columnsort = h.sort + case h.sort
when 400 then ss.sort
when 500 then ggs.sort
when 600 then ggd.sort
else 0
end,
Amount =
case h.sort
when 300 then isnull(o.Sale, 0)
when 400 then isnull(s.Amount, 0)
when 500 then isnull(gs.Amount, 0)
when 600 then -isnull(gd.Amount, 0)
when 700 then -isnull(o.Discount, 0)
when 800 then isnull(o.Tax, 0)
when 999 then isnull(o.Sale, 0) + isnull(s.Amount, 0) + isnull(gs.Amount, 0) - isnull(gd.Amount, 0) - isnull(o.Discount, 0) + isnull(o.Tax, 0)
end,
Caption =
case h.sort
when 100 then case ll.sort when 0 then h.description else case dd.sort when 99999 then 'Total' else ll.code end end
when 200 then case ll.sort when 0 then h.description else convert(varchar, dd.date, 101) end
when 400 then ss.code
when 500 then ggs.code + ' ' + ggs.name
when 600 then ggd.code + ' (Discounts)'
else h.description
end
into #ReportSalesAnalysis
from (select distinct locationsort from @ordermoney) l
inner join (select distinct locationsort, datesort from @ordermoney) ld on l.locationsort = ld.locationsort
inner join @locations ll on l.locationsort = ll.sort
inner join @dates dd on ld.datesort = dd.sort
cross join @header h
left join @ordermoney o on h.sort in (300, 700, 800, 999)
and ld.locationsort = o.locationsort
and ld.datesort = o.datesort
left join (select distinct t.*, m.servicesort from @servicemoney m left join @services t on m.servicesort = t.sort) ss
on h.sort = ss.servicesort or (h.sort = 400 and ss.servicesort < 100)
left join @servicemoney s on ss.servicesort = s.servicesort
and ld.locationsort = s.locationsort -- this line produces the error
-- the error is:
-- The multi-part identifier "ld.locationsort" could not be bound
and ld.datesort = s.datesort
left join (select distinct t.*, m.glcodesort from @glcodessales m left join @glcodes t on m.glcodesort = t.sort) ggs
on h.sort = ggs.glcodesort or (h.sort = 500 and ggs.glcodesort < 100)
left join @glcodessales gs on ggs.glcodesort = gs.glcodesort
and ld.locationsort = gs.locationsort
and ld.datesort = gs.datesort
left join (select distinct t.*, m.glcodesort from @glcodesdiscounts m left join @glcodes t on m.glcodesort = t.sort) ggd
on h.sort = ggd.glcodesort or (h.sort = 600 and ggd.glcodesort < 100)
left join @glcodesdiscounts gd on ggd.glcodesort = gd.glcodesort
and ld.locationsort = gd.locationsort
and ld.datesort = gd.datesort;
ZGVjbGFyZSBAaGVhZGVyIHRhYmxlIChzb3J0IGludCwgZGVzY3JpcHRpb24gdmFyY2hhcig1MCkpOwpkZWNsYXJlIEBkYXRlcyB0YWJsZSAoZGF0ZSBkYXRldGltZSwgc29ydCBpbnQpOwpkZWNsYXJlIEBzZXJ2aWNlcyB0YWJsZSAoY29kZSB2YXJjaGFyKDUwKSwgc29ydCBpbnQpOwpkZWNsYXJlIEBnbGNvZGVzIHRhYmxlIChpZCBpbnQsIGNvZGUgdmFyY2hhcig1MCksIG5hbWUgdmFyY2hhcig1MCksIGNvZWYgaW50LCBzb3J0IGludCk7CmRlY2xhcmUgQGxvY2F0aW9ucyB0YWJsZSAoaWQgaW50LCBjb2RlIHZhcmNoYXIoMTApLCBuYW1lIHZhcmNoYXIoNTApLCBzb3J0IGludCk7CmRlY2xhcmUgQG9yZGVycyB0YWJsZSAoCiAgSUQgaW50LAogIExvY2F0aW9uIGludCwKICBTYWxlIG1vbmV5LAogIERpc2NvdW50IG1vbmV5LAogIFRheCBtb25leSwKICBEYXRlIGRhdGV0aW1lCik7CgpkZWNsYXJlIEBnbGNvZGVzZGlzY291bnRzIHRhYmxlIChnbGNvZGVzb3J0IGludCwgbG9jYXRpb25zb3J0IGludCwgZGF0ZXNvcnQgaW50LCBBbW91bnQgbW9uZXkpOwpkZWNsYXJlIEBnbGNvZGVzc2FsZXMgdGFibGUgKGdsY29kZXNvcnQgaW50LCBsb2NhdGlvbnNvcnQgaW50LCBkYXRlc29ydCBpbnQsIEFtb3VudCBtb25leSk7CmRlY2xhcmUgQHNlcnZpY2Vtb25leSB0YWJsZSAoc2VydmljZXNvcnQgaW50LCBsb2NhdGlvbnNvcnQgaW50LCBkYXRlc29ydCBpbnQsIEFtb3VudCBtb25leSk7CmRlY2xhcmUgQG9yZGVybW9uZXkgdGFibGUgKGxvY2F0aW9uc29ydCBpbnQsIGRhdGVzb3J0IGludCwgU2FsZSBtb25leSwgRGlzY291bnQgbW9uZXksIFRheCBtb25leSk7CgpzZWxlY3QKICBsZC5sb2NhdGlvbnNvcnQsCiAgbGQuZGF0ZXNvcnQsCiAgY29sdW1uc29ydCA9IGguc29ydCArIGNhc2UgaC5zb3J0CiAgICB3aGVuIDQwMCB0aGVuIHNzLnNvcnQKICAgIHdoZW4gNTAwIHRoZW4gZ2dzLnNvcnQKICAgIHdoZW4gNjAwIHRoZW4gZ2dkLnNvcnQKICAgIGVsc2UgMAogIGVuZCwKICBBbW91bnQgPSAgCiAgY2FzZSBoLnNvcnQKICAgIHdoZW4gMzAwIHRoZW4gaXNudWxsKG8uU2FsZSwgMCkKICAgIHdoZW4gNDAwIHRoZW4gaXNudWxsKHMuQW1vdW50LCAwKQogICAgd2hlbiA1MDAgdGhlbiBpc251bGwoZ3MuQW1vdW50LCAwKQogICAgd2hlbiA2MDAgdGhlbiAtaXNudWxsKGdkLkFtb3VudCwgMCkKICAgIHdoZW4gNzAwIHRoZW4gLWlzbnVsbChvLkRpc2NvdW50LCAwKQogICAgd2hlbiA4MDAgdGhlbiBpc251bGwoby5UYXgsIDApCiAgICB3aGVuIDk5OSB0aGVuIGlzbnVsbChvLlNhbGUsIDApICsgaXNudWxsKHMuQW1vdW50LCAwKSArIGlzbnVsbChncy5BbW91bnQsIDApIC0gaXNudWxsKGdkLkFtb3VudCwgMCkgLSBpc251bGwoby5EaXNjb3VudCwgMCkgKyBpc251bGwoby5UYXgsIDApCiAgZW5kLAogIENhcHRpb24gPSAgCiAgY2FzZSBoLnNvcnQKICAgIHdoZW4gMTAwIHRoZW4gY2FzZSBsbC5zb3J0IHdoZW4gMCB0aGVuIGguZGVzY3JpcHRpb24gZWxzZSBjYXNlIGRkLnNvcnQgd2hlbiA5OTk5OSB0aGVuICdUb3RhbCcgZWxzZSBsbC5jb2RlIGVuZCBlbmQKICAgIHdoZW4gMjAwIHRoZW4gY2FzZSBsbC5zb3J0IHdoZW4gMCB0aGVuIGguZGVzY3JpcHRpb24gZWxzZSBjb252ZXJ0KHZhcmNoYXIsIGRkLmRhdGUsIDEwMSkgZW5kCiAgICB3aGVuIDQwMCB0aGVuIHNzLmNvZGUKICAgIHdoZW4gNTAwIHRoZW4gZ2dzLmNvZGUgKyAnICcgKyBnZ3MubmFtZQogICAgd2hlbiA2MDAgdGhlbiBnZ2QuY29kZSArICcgKERpc2NvdW50cyknCiAgICBlbHNlIGguZGVzY3JpcHRpb24KICBlbmQKaW50byAjUmVwb3J0U2FsZXNBbmFseXNpcwpmcm9tIChzZWxlY3QgZGlzdGluY3QgbG9jYXRpb25zb3J0IGZyb20gQG9yZGVybW9uZXkpIGwKaW5uZXIgam9pbiAoc2VsZWN0IGRpc3RpbmN0IGxvY2F0aW9uc29ydCwgZGF0ZXNvcnQgZnJvbSBAb3JkZXJtb25leSkgbGQgb24gbC5sb2NhdGlvbnNvcnQgPSBsZC5sb2NhdGlvbnNvcnQKaW5uZXIgam9pbiBAbG9jYXRpb25zIGxsIG9uIGwubG9jYXRpb25zb3J0ID0gbGwuc29ydAppbm5lciBqb2luIEBkYXRlcyBkZCBvbiBsZC5kYXRlc29ydCA9IGRkLnNvcnQKY3Jvc3Mgam9pbiBAaGVhZGVyIGgKbGVmdCBqb2luIEBvcmRlcm1vbmV5IG8gb24gaC5zb3J0IGluICgzMDAsIDcwMCwgODAwLCA5OTkpCiAgYW5kIGxkLmxvY2F0aW9uc29ydCA9IG8ubG9jYXRpb25zb3J0CiAgYW5kIGxkLmRhdGVzb3J0ID0gby5kYXRlc29ydApsZWZ0IGpvaW4gKHNlbGVjdCBkaXN0aW5jdCB0LiosIG0uc2VydmljZXNvcnQgZnJvbSBAc2VydmljZW1vbmV5IG0gbGVmdCBqb2luIEBzZXJ2aWNlcyB0IG9uIG0uc2VydmljZXNvcnQgPSB0LnNvcnQpIHNzCiAgb24gaC5zb3J0ID0gc3Muc2VydmljZXNvcnQgb3IgKGguc29ydCA9IDQwMCBhbmQgc3Muc2VydmljZXNvcnQgPCAxMDApCmxlZnQgam9pbiBAc2VydmljZW1vbmV5IHMgb24gc3Muc2VydmljZXNvcnQgPSBzLnNlcnZpY2Vzb3J0CiAgYW5kIGxkLmxvY2F0aW9uc29ydCA9IHMubG9jYXRpb25zb3J0ICAtLSB0aGlzIGxpbmUgcHJvZHVjZXMgdGhlIGVycm9yCi0tIHRoZSBlcnJvciBpczoKLS0gVGhlIG11bHRpLXBhcnQgaWRlbnRpZmllciAibGQubG9jYXRpb25zb3J0IiBjb3VsZCBub3QgYmUgYm91bmQKICBhbmQgbGQuZGF0ZXNvcnQgPSBzLmRhdGVzb3J0CmxlZnQgam9pbiAoc2VsZWN0IGRpc3RpbmN0IHQuKiwgbS5nbGNvZGVzb3J0IGZyb20gQGdsY29kZXNzYWxlcyBtIGxlZnQgam9pbiBAZ2xjb2RlcyB0IG9uIG0uZ2xjb2Rlc29ydCA9IHQuc29ydCkgZ2dzCiAgb24gaC5zb3J0ID0gZ2dzLmdsY29kZXNvcnQgb3IgKGguc29ydCA9IDUwMCBhbmQgZ2dzLmdsY29kZXNvcnQgPCAxMDApCmxlZnQgam9pbiBAZ2xjb2Rlc3NhbGVzIGdzIG9uIGdncy5nbGNvZGVzb3J0ID0gZ3MuZ2xjb2Rlc29ydAogIGFuZCBsZC5sb2NhdGlvbnNvcnQgPSBncy5sb2NhdGlvbnNvcnQKICBhbmQgbGQuZGF0ZXNvcnQgPSBncy5kYXRlc29ydApsZWZ0IGpvaW4gKHNlbGVjdCBkaXN0aW5jdCB0LiosIG0uZ2xjb2Rlc29ydCBmcm9tIEBnbGNvZGVzZGlzY291bnRzIG0gbGVmdCBqb2luIEBnbGNvZGVzIHQgb24gbS5nbGNvZGVzb3J0ID0gdC5zb3J0KSBnZ2QKICBvbiBoLnNvcnQgPSBnZ2QuZ2xjb2Rlc29ydCBvciAoaC5zb3J0ID0gNjAwIGFuZCBnZ2QuZ2xjb2Rlc29ydCA8IDEwMCkKbGVmdCBqb2luIEBnbGNvZGVzZGlzY291bnRzIGdkIG9uIGdnZC5nbGNvZGVzb3J0ID0gZ2QuZ2xjb2Rlc29ydAogIGFuZCBsZC5sb2NhdGlvbnNvcnQgPSBnZC5sb2NhdGlvbnNvcnQKICBhbmQgbGQuZGF0ZXNvcnQgPSBnZC5kYXRlc29ydDsK