Here you go: SELECT *
FROM crosstab( 'SELECT s.s_n AS Pop , ad.a_d_y::text AS Yr , ad.s_a_qty::text --for some Pop all of these are null for every Yr FROM st AS s JOIN s_d_s AS sds ON s.s_id = sds.s_id JOIN a_d_d AS ad ON sds.sds_id = ad.sds_id JOIN d_t_l AS dtl ON dtl.dtl_id = sds.dtl_id WHERE dtl.dtl_id = ''3edcb910-fc0c-49e0-be93-a93e98cb12bb'' AND s.s_id IN ( ''9adfe0ee-af21-4ec7-a466-c89bbfa0f750'' , ''8714b2e3-d7ba-4494-a3ed-99c6d3aa2a9c'' , ''45ecb932-ece9-43ce-8095-54181f33419e'' , ''fa934121-67ed-4d10-84b0-c8f36a52544b'' , ''b7d5e226-e036-43c2-bd27-d9ae06a87541'' ) ORDER BY 1,2', 'SELECT DISTINCT a_d_y FROM a_d_d WHERE a_d_y BETWEEN 2017 AND 2021 ORDER BY 1') AS final_result(Pop TEXT, "2017" TEXT, "2018" TEXT, "2019" TEXT, "2020" TEXT, "2021" TEXT ); A row for each one of the matching s.s_id values should be displayed, even if all the ad.s_a_qty values for that Yr are NULL; right now, the query works, but it only returns matching rows for which at least one year has a non-NULL ad.s_a_qty. Thanks in advance for your help. On Sat, Dec 24, 2022 at 7:25 PM Brad White <b55wh...@gmail.com> wrote: > On 12/24/2022 9:03 PM, David Goldsmith wrote: > > How do I force "empty rows" to be included in my query output? (I've > > tried LEFT JOINing to the row header results, and using CASE > > statements; but due to my unfamiliarity w/ using crosstab, I'm not > > sure if I've used those correctly in the current context; > > > Can you give us a head start by showing the query you have now that is > not working. > > Extra points if you give simple create/populate statements that > demonstrate the problem. > > Hope that helps, > Brad. > >