I moved the function to Postgres. In MS SQL, it was executed in less than a second. In Postgresql, it runs for almost 6 minutes. I've been working on this problem for 6 hours, and I haven't found a reason. As I understand it, the problem is in the syntax.
In the xt_ed_registr_grp_led function, I attach the function (xt_ef_registr_pts_all) to a table in this format:
LEFT JOIN dbo.xt_ef_registr_pts_all(_D_Date, -1, NULL) AS RP_Child
ON RP_Child.link = RG.f_registr_pts
Next, I attach the code from MS SQL and Postgres.
Postgres function
...
AS
$$
BEGIN
RETURN QUERY SELECT
RP.link,
RP.f_division,
RP.f_subdivision,
RP.f_subscr,
RP.f_sale_items,
RP.f_sale_category,
RP.d_date_begin,
RP.d_date_end,
RCap.f_work_modes AS F_Work_Modes,
RP.f_energy_levels,
NP.f_conn_points,
NP.c_address_short,
CASE
WHEN COALESCE(Provinces.c_name, '') = ''
THEN NULL
ELSE LTRIM(RTRIM((COALESCE(LT_Provinces.c_prefix || ' ', '') || COALESCE(Provinces.c_name, ''))))
END AS C_Provinces,
CASE
WHEN COALESCE(Towns.c_name, '') = ''
THEN NULL
ELSE LTRIM(RTRIM((COALESCE(LT_Towns.c_prefix || ' ', '') || COALESCE(Towns.c_name, ''))))
END AS C_Towns,
CASE
WHEN COALESCE(Municipalities.c_name, '') = ''
THEN NULL
ELSE LTRIM(RTRIM((COALESCE(LT_Municipalities.c_prefix || ' ', '') || COALESCE(Municipalities.c_name, ''))))
END AS C_Municipalities,
CASE
WHEN LTRIM(RTRIM(((COALESCE(LT_Streets.c_prefix || ' ', '') || COALESCE(Streets.c_name, '')) || COALESCE(', ' || CP.c_building_num, '') ||
COALESCE(COALESCE(' ' || sbct.c_short_name, ' ' || sbct.c_name, '/') || CP.c_building_corp, '')))) = ''
THEN NULL
ELSE LTRIM(RTRIM(((COALESCE(LT_Streets.c_prefix || ' ', '') || COALESCE(Streets.c_name, '')) || COALESCE(', ' || CP.c_building_num, '') ||
COALESCE(COALESCE(' ' || sbct.c_short_name, ' ' || sbct.c_name, '/') || CP.c_building_corp, ''))))
END AS C_Street_Building,
RCM.f_calc_methods,
RCM.d_date AS D_Calc_Methods_Date,
CASE
WHEN EXISTS(SELECT
0
FROM dbo.ed_registr_grp RG1
WHERE RG1.f_registr_pts_main = RP.link
)
THEN TRUE
ELSE FALSE
END AS B_Group,
CASE
WHEN EXISTS(SELECT
0
FROM dbo.ed_registr_grp RG1
WHERE RG1.f_registr_pts = RP.link
)
THEN TRUE
ELSE FALSE
END AS B_IncludeGroup,
dbo.xt_ef_registr_pts_energy_categ(RP.f_sale_items, RP.f_tariff, RP.f_energy_levels) AS F_Energy_Category,
RP.f_registr_pts_prev,
D.link AS F_Device,
EDP.f_division AS f_device_division,
D.n_rate,
D.n_rate * dbo.ui_ef_device_transf_rate(D.f_division, D.link, COALESCE(_D_Date, NOW())) AS N_Ktf,
Dig.c_digits,
EDC.c_name AS C_Device_Category_Name,
EDC.f_class,
D.f_device_types,
D.c_serial_number,
EDP.f_energy_types,
EDP.n_percent2,
EDP.b_main AS B_Device_Main,
D.d_setup_date,
D.d_replace_date,
EDP.n_percent,
RPT.f_tariff,
RPT.d_date::timestamptz(0)::text AS D_Tariff_Date,
RPT.f_norms,
RCon.n_cons AS N_Cons_Cons,
RCon.n_cons2 AS N_Cons_Cons2,
RCon.d_date AS D_Cons_Date,
RCap.n_cap AS N_Cap_Cons,
RCap.n_cap2 AS N_Cap_Cons2,
RCap.n_cap3 AS N_Cap_Cons3,
RCap.d_date AS D_Cap_Date,
RPA.n_rate AS N_Activity_Rate,
RPA.d_date AS D_Activity_Date,
RP.c_code AS n_code,
RP.c_name,
RP.f_balance_types,
RP.f_balance_type_details,
RP.f_balance_types_sec,
RP.f_balance_type_details_sec,
RP.n_order,
RP.b_non_heat_formula,
RP.b_line_formula,
RP.b_transf_formula,
RP.f_transf_types,
SDA.link AS F_Areas,
erpa.d_date AS D_Areas_Date,
RP.b_notinclude,
RP.f_form_46,
RP.f_cons_category,
RP.s_owner,
RP.s_create_date,
RP.s_modif_date,
RP.s_creator,
NP.link AS F_Network_Pts,
NP.c_code AS C_Network_Pts_Code,
NR.c_network_path AS _Bound_F_Network_Pts,
NR.c_network_path_short AS C_Network_Path_Short,
CASE
WHEN NIP.f_parent IS NOT NULL
THEN dbo.cf_get_network_name(COALESCE(NI_P.f_networks, NI.f_networks))
END AS _Bound_F_Network,
FSI.c_name AS _Bound_F_Sale_Items,
EDT.c_name || COALESCE(' / ' || EDT.c_modification, '') AS _Bound_F_Device_Types,
(dbo.cf_get_c_codename(FT.n_code, FT.c_name) || ' / ' || CAST(COALESCE(FTH.n_tariff, '0') AS text) || 'р.') AS _Bound_F_Tariff,
FTH.n_tariff AS N_Tariff1,
FTH.n_tariff_2 AS N_Tariff2,
EEL.c_name AS _Bound_F_Energy_Levels,
ECM.c_name || COALESCE(' / ' || ECM2.c_name, '') AS _Bound_F_Calc_Methods,
COALESCE(EBT.c_short_name, EBT.c_name) AS _Bound_F_Balance_Types,
COALESCE(EET.c_short_name, EET.c_name) AS _Bound_F_Energy_Types,
ESWM.c_name AS _Bound_F_Work_Modes,
ELA.c_name AS _Bound_F_Transf_Algorithms,
ELA2.c_name AS _Bound_F_Line_Algorithms,
ELA3.c_name AS _Bound_F_Non_Heat_Algorithms,
SDA.c_name AS _Bound_F_Areas,
CP.c_code_cp AS N_Conn_Points_Code,
COALESCE(CP.c_name, NP.c_address_short) AS C_Conn_Points_Name,
COALESCE(CPS.c_name, '') || COALESCE(' ' || CT.c_name_short, '') || COALESCE(' № ' || CPS.c_premise_number, '') AS C_Conn_Points_Sub_Name,
CPS.c_premise_number AS C_Premise_Number,
COALESCE((CPS.j_custom ->> 'j_b_dryers')::bool, (CP.j_custom ->> 'j_b_dryers')::bool) AS B_Polotenchik,
COALESCE((CPS.j_custom ->> 'j_b_riser_insulation')::bool, (CP.j_custom ->> 'j_b_riser_insulation')::bool) AS B_Isolation,
COALESCE((CPS.j_custom ->> 'j_b_external_gvs')::bool, (CP.j_custom ->> 'j_b_external_gvs')::bool) AS B_OuterGVS,
CP.f_conn_types AS F_Conn_Types,
CP.f_conn_status_types AS F_Conn_Status_Types,
FSC.c_name AS _Bound_F_Sale_Category,
ETT.c_name AS _Bound_F_Transf_Types,
FN.c_name AS _Bound_F_Norms,
dbo.cf_get_network_name(COALESCE(NI_P.f_networks, NI.f_networks)) AS C_Network_Path,
RP.n_graph_form,
RP.n_line_loss,
RP.n_rp_loss,
NP.f_conn_points_sub,
RPL_Non_Heat.d_date_begin AS D_Non_Heat_Date,
RPL_Non_Heat.n_value AS N_Non_Heat_Waste,
RPL_Non_Heat.f_loss_algorithms AS F_Non_Heat_Algorithms,
RPL_Line.d_date_begin AS D_Line_Date,
RPL_Line.n_value AS N_Line_Waste,
RPL_Line.f_loss_algorithms AS F_Line_Algorithms,
RPL_Transf.d_date_begin AS D_Transf_Date,
RPL_Transf.n_value AS N_Transf_Waste,
RPL_Transf.f_loss_algorithms AS F_Transf_Algorithms,
s.n_code AS N_Code_Subscr,
p.c_name1 AS C_Name_Subscr
FROM dbo.ed_registr_pts AS RP
LEFT JOIN dbo.sd_subscr AS s
ON s.link = RP.f_subscr
LEFT JOIN dbo.cd_partners AS p
ON p.link = s.f_partners
LEFT JOIN dbo.ed_network_pts AS NP
ON NP.link = RP.f_network_pts
AND NP.b_pod = TRUE
LEFT JOIN LATERAL
( SELECT
NIPX.link,
NIPX.f_parent
FROM dbo.ed_network_struct NIPX
WHERE NIPX.f_child = NP.link
AND NIPX.b_pod = TRUE
AND NIPX.b_ismain = TRUE
AND NIPX.d_date_begin <= COALESCE(_D_Date, NOW())
ORDER BY
NIPX.d_date_begin DESC
LIMIT 1
) AS NIP
ON TRUE
LEFT JOIN LATERAL
(
SELECT
NIPX.link,
NIPX.f_parent
FROM dbo.ed_network_struct NIPX
WHERE NIPX.f_child = NP.f_network_pts
AND NIPX.b_pod = TRUE
AND NIPX.b_ismain = TRUE
AND NIPX.d_date_begin <= COALESCE(_D_Date, NOW())
ORDER BY
NIPX.d_date_begin DESC
LIMIT 1
) AS NIP_P
ON TRUE
LEFT JOIN LATERAL
(
SELECT
NRi.id,
NRi.c_network_path,
NRi.c_network_path_short
FROM dbo.ed_network_routes NRi
WHERE NRi.n_level = 0
AND NRi.link = COALESCE(NIP_P.f_parent, NIP.f_parent)
AND NOW() >= NRi.d_date0
AND NOW() < NRi.d_date1
ORDER BY
NRi.n_rate,
NRi.d_date1,
NRi.b_main DESC
LIMIT 1
) AS NR
ON TRUE
LEFT JOIN dbo.ed_network_pts NI
ON NI.link = NIP.f_parent
AND NI.b_pod = FALSE
LEFT JOIN dbo.ed_network_pts NI_P
ON NI_P.link = NIP_P.f_parent
AND NI_P.b_pod = FALSE
/* Объект и адрес */
LEFT JOIN dbo.sd_conn_points CP
ON CP.link = NP.f_conn_points
LEFT JOIN dbo.sd_conn_points_sub CPS
ON CPS.link = NP.f_conn_points_sub
LEFT JOIN dbo.cs_conn_types CT
ON CT.link = CPS.f_conn_types
LEFT JOIN dbo.ss_building_corp_type sbct
ON sbct.link = CP.f_building_corp_type
LEFT JOIN dbo.ss_locations AS Provinces
ON Provinces.link = CP.f_provinces_fias
LEFT JOIN dbo.ss_location_types AS LT_Provinces
ON LT_Provinces.link = Provinces.f_location_types
LEFT JOIN dbo.ss_locations AS Towns
ON Towns.link = CP.f_towns_fias
LEFT JOIN dbo.ss_location_types AS LT_Towns
ON LT_Towns.link = Towns.f_location_types
LEFT JOIN dbo.ss_locations AS Municipalities
ON Municipalities.link = CP.f_municipalities_fias
LEFT JOIN dbo.ss_location_types AS LT_Municipalities
ON LT_Municipalities.link = Municipalities.f_location_types
LEFT JOIN dbo.ss_locations AS Streets
ON Streets.link = CP.f_streets_fias
LEFT JOIN dbo.ss_location_types AS LT_Streets
ON LT_Streets.link = Streets.f_location_types /* Параметры ТУ */
LEFT JOIN dbo.ed_registr_pts_areas AS erpa
ON erpa.f_registr_pts = RP.link
AND erpa.d_date <= COALESCE(_D_Date, NOW())
AND erpa.d_date_end > COALESCE(_D_Date, NOW())
LEFT JOIN dbo.sd_areas AS SDA
ON SDA.link = erpa.f_areas
LEFT JOIN dbo.ed_registr_pts_loss AS RPL_Line
ON RPL_Line.f_registr_pts = RP.link
AND RPL_Line.f_loss_types = 1
AND COALESCE(_D_Date, NOW()) BETWEEN RPL_Line.d_date_begin AND RPL_Line.d_date_end
LEFT JOIN dbo.ed_registr_pts_loss AS RPL_Transf
ON RPL_Transf.f_registr_pts = RP.link
AND RPL_Transf.f_loss_types = 2
AND COALESCE(_D_Date, NOW()) BETWEEN RPL_Transf.d_date_begin AND RPL_Transf.d_date_end
LEFT JOIN dbo.ed_registr_pts_loss AS RPL_Non_Heat
ON RPL_Non_Heat.f_registr_pts = RP.link
AND RPL_Non_Heat.f_loss_types = 3
AND COALESCE(_D_Date, NOW()) BETWEEN RPL_Non_Heat.d_date_begin AND RPL_Non_Heat.d_date_end
LEFT JOIN LATERAL
(
SELECT
RPA1.n_rate,
RPA1.d_date,
RPA1.f_registr_pts
FROM dbo.ed_registr_pts_activity AS RPA1
WHERE RPA1.f_registr_pts = RP.link
AND RPA1.d_date <= COALESCE(_D_Date, NOW())
ORDER BY
d_date DESC
LIMIT 1
) AS RPA
ON TRUE
LEFT JOIN dbo.ed_registr_pts_tariff AS RPT
ON RPT.f_registr_pts = RP.link
AND COALESCE(_D_Date, NOW()) BETWEEN RPT.d_date AND RPT.d_date_end
LEFT JOIN dbo.fs_tariff AS FT
ON FT.link = RPT.f_tariff
LEFT JOIN LATERAL
(
SELECT
FTH.n_tariff,
FTH.n_tariff_2
FROM dbo.fs_tariff_history FTH
WHERE FTH.f_tariff = FT.link
AND FTH.b_default = TRUE
AND COALESCE(_D_Date, NOW()) BETWEEN FTH.d_date_begin AND FTH.d_date_end
ORDER BY
FTH.link
LIMIT 1
) AS FTH
ON TRUE
LEFT JOIN dbo.ed_registr_pts_cap AS RCap
ON RCap.f_registr_pts = RP.link
AND RCap.b_contract = FALSE
AND COALESCE(_D_Date, NOW()) BETWEEN RCap.d_date AND RCap.d_date_end
LEFT JOIN LATERAL
(
SELECT
RCon_.n_cons,
RCon_.n_cons2,
RCon_.d_date
FROM dbo.ed_registr_pts_cons AS RCon_
WHERE RP.link = RCon_.f_registr_pts
AND RCon_.b_contract = FALSE
AND COALESCE(_D_Date, NOW()) BETWEEN RCon_.d_date AND RCon_.d_date_end
ORDER BY
RCon_.d_date
LIMIT 1
) AS RCon
ON TRUE
LEFT JOIN dbo.ed_registr_pts_calc_methods AS RCM
ON RCM.f_registr_pts = RP.link
AND COALESCE(_D_Date, NOW()) BETWEEN RCM.d_date AND RCM.d_date_end
LEFT JOIN dbo.es_calc_methods AS ECM
ON ECM.link = RCM.f_calc_methods
LEFT JOIN dbo.es_calc_methods AS ECM2
ON ECM2.link = RCM.f_calc_methods_default
LEFT JOIN LATERAL
(
SELECT
EDP1.link,
EDP1.f_devices,
EDP1.f_energy_types,
EDP1.n_percent,
EDP1.n_percent2,
EDP1.b_main,
EDP1.f_division
FROM dbo.ed_devices_pts EDP1
INNER JOIN dbo.ed_devices D1
ON D1.link = EDP1.f_devices
AND D1.d_setup_date <= COALESCE(_D_Date, NOW())
WHERE EDP1.f_registr_pts = RP.link
ORDER BY
D1.d_setup_date DESC
LIMIT 1
) AS EDP
ON TRUE
LEFT JOIN dbo.ed_devices D
ON D.link = EDP.f_devices
LEFT JOIN dbo.es_device_types EDT
ON EDT.link = D.f_device_types
LEFT JOIN dbo.es_device_categories EDC
ON EDC.link = EDT.f_device_categories
LEFT JOIN LATERAL dbo.ef_device_digits_list(D.link) AS Dig
ON TRUE
LEFT JOIN dbo.fs_sale_items AS FSI
ON FSI.link = RP.f_sale_items
LEFT JOIN dbo.fs_sale_categories AS FSC
ON FSC.link = RP.f_sale_category
LEFT JOIN dbo.es_energy_levels AS EEL
ON EEL.link = RP.f_energy_levels
LEFT JOIN dbo.es_balance_types AS EBT
ON EBT.link = RP.f_balance_types
LEFT JOIN dbo.es_loss_algorithms AS ELA
ON ELA.link = RP.f_transf_algorithms
LEFT JOIN dbo.es_loss_algorithms AS ELA2
ON ELA2.link = RP.f_line_algorithms
LEFT JOIN dbo.es_loss_algorithms AS ELA3
ON ELA3.link = RP.f_non_heat_algorithms
LEFT JOIN dbo.fs_norms FN
ON FN.link = RPT.f_norms
LEFT JOIN dbo.es_transf_types AS ETT
ON ETT.link = RP.f_transf_types
LEFT JOIN dbo.es_work_modes AS ESWM
ON ESWM.link = RCap.f_work_modes
LEFT JOIN dbo.es_energy_types AS EET
ON EET.link = EDP.f_energy_types
WHERE RP.d_date_begin <= COALESCE(_D_Date, NOW())
AND RP.f_division = COALESCE(_F_Division, RP.f_division)
AND (
_F_Areas = -1
OR _F_Areas = erpa.f_areas
OR (
_F_Areas IS NULL
AND erpa.f_areas IS NULL
)
OR (
_F_Areas IS NULL
AND erpa.f_areas = 0
)
);
END;
$$;
Initially, I thought the problem was in the tables used, because the structure has changed, but I checked the function with the replacement with the necessary ones, nothing has changed. So I think the problem is not in the tables.
This works:
SELECT DISTINCT
"public".visit.visit_id,
"public".visit.visit_name,
"public".visit.visit_admit_date,
"public".visit.visit_disch_date,
"public".visit.visit_stay_type,
"public".visit.visit_ins,
"public".ip_visit_1.ipv1_room,
"public".ip_visit_1.ipv1_ad_init,
CASE WHEN (SELECT digital_signature_images.dsigimg_acct FROM digital_signature_images where "public".visit.visit_id = digital_signature_images.dsigimg_acct AND digital_signature_images.dsigimg_title = 'IMPORTANT LETTER FROM MEDICARE') IS NOT NULL THEN 'YES'
WHEN (SELECT patient_images.patimg_acct FROM patient_images where visit.visit_id = patient_images.patimg_acct AND patient_images.patimg_title = 'IMPORTANT LETTER FROM MEDICARE') IS NOT NULL THEN 'YES' ELSE 'NOT ON FILE' END AS IMFM_ON_FILE
FROM
"public".digital_signature_images
INNER JOIN "public".visit ON "public".visit.visit_id = "public".digital_signature_images.dsigimg_acct
INNER JOIN "public".ip_visit_1 ON "public".visit.visit_id = "public".ip_visit_1.ipv1_num
INNER JOIN "public".patient_images ON "public".patient_images.patimg_acct = "public".visit.visit_id
WHERE
"public".visit.visit_ins LIKE 'M%' AND
"public".visit.visit_stay_type = '1' AND
"public".visit.visit_disch_date = '2022-07-01'
ORDER BY
"public".ip_visit_1.ipv1_room
When I try to do the previous month only in the WHERE portion, I get told "More than one row returned by a subquery used as an expression:
SELECT DISTINCT
"public".visit.visit_id,
"public".visit.visit_name,
"public".visit.visit_admit_date,
"public".visit.visit_disch_date,
"public".visit.visit_stay_type,
"public".visit.visit_ins,
"public".ip_visit_1.ipv1_room,
"public".ip_visit_1.ipv1_ad_init,
CASE WHEN (SELECT digital_signature_images.dsigimg_acct FROM digital_signature_images where "public".visit.visit_id = digital_signature_images.dsigimg_acct AND digital_signature_images.dsigimg_title = 'IMPORTANT LETTER FROM MEDICARE') IS NOT NULL THEN 'YES'
WHEN (SELECT patient_images.patimg_acct FROM patient_images where visit.visit_id = patient_images.patimg_acct AND patient_images.patimg_title = 'IMPORTANT LETTER FROM MEDICARE') IS NOT NULL THEN 'YES' ELSE 'NOT ON FILE' END AS IMFM_ON_FILE
FROM
"public".digital_signature_images
INNER JOIN "public".visit ON "public".visit.visit_id = "public".digital_signature_images.dsigimg_acct
INNER JOIN "public".ip_visit_1 ON "public".visit.visit_id = "public".ip_visit_1.ipv1_num
INNER JOIN "public".patient_images ON "public".patient_images.patimg_acct = "public".visit.visit_id
WHERE
"public".visit.visit_ins LIKE 'M%' AND
"public".visit.visit_stay_type = '1' AND
ip_visit_1.ipv1_dis_date >= DATE_TRUNC('MONTH', CURRENT_DATE - INTERVAL '1 MONTH') AND
ip_visit_1.ipv1_dis_date < DATE_TRUNC('MONTH', CURRENT_DATE)
ORDER BY
"public".ip_visit_1.ipv1_room
How can I return the previous month?
use EXISTS (subquery) to determine if a subquery returns at least one row. It returns a boolean, so you can put it directly after the WHEN.
**The below query is working badly, and I'm planning to replace case stmt in where clause with temp table. Pls suggest to me some option to rewrite this query
Is there a way to simplify this into multiple SQLs
Also explain me how this case stmt works in where clause**
select DISTINCT
ph.order_type_cd,
c.order_num,
ph.created_date,
os.order_status_desc,
ph.facility_name,
PH.vendor_order_num,
l.lic_nm,
(u.last_nm + ', ' + u.first_nm )as requestor_nm,
bl.billing_location_desc,
ph.ship_to_name,
dm.dispatch_method_name_desc as courier,
PH.po_last_updated_dt as last_updated_date,
(u1.last_nm + ', ' + u1.first_nm )as last_updated_by,
ph.right_grp_id,
c.line_id,
a.material_product_id,
a.parent_material_product_id
from avt_po_detail c
inner join avt_po_hdr ph on ph.order_num = c.order_num
left outer join avt_material_product AS a on a.material_product_id=c.material_product_id
INNER JOIN #entity_ids po on po.entity_id = c.order_num --or #select_pos = 0 )
LEFT OUTER JOIN dbo.ert_product AS pc ON pc.product_id = a.product_id
left outer join ert_product_type as pt on pt.product_type_cd = pc.product_type_cd
LEFT OUTER JOIN dbo.ert_product_xref as xref on xref.product_id = a.parent_product_id AND xref.version_id = 1
left outer join avt_order_status AS OS ON OS.order_status_cd = PH.order_status_cd
left outer join avt_licensee l on l.lic_id = ph.lic_id
left outer join avt_po_from pf on pf.material_product_id = a.material_product_id and pf.line_id = c.line_id
left outer join avt_po_audio_detail pad on pad.line_id = c.line_id
left outer join avt_materials_trans_material MTM on mtm.sequence_no = c.video_seq_no
left outer join avt_user u on u.userid = ph.requestor_id
left outer join avt_user u1 on u1.userid = ph.po_last_updated_by
left outer join avt_billing_location bl on bl.billing_location_cd = PH.billing_location_cd
left outer join avt_dispatch_method_name dm on dm.dispatch_method_name_id = PH.dispatch_method_name_id
left outer join avt_right_group arg on arg.right_grp_id = ph.right_grp_id
left outer join #prod product on product.product_id=a.product_id and (product.version_id=c.dist_version_id OR product.version_id = 1)
where (pf.from_desc in ( select from_desc from #from_desc ) or #select_form = 0)
and (case WHEN c.dist_version_id IS NULL THEN c.UCS_prod_no
ELSE
CASE
WHEN isnull(pt.version_control_ind, 'N') = 'Y' THEN xref.rss_prod_no
WHEN
isnull(pt.version_control_ind, 'N') = 'N' AND
xref.rss_prod_no IS NULL AND
xref.rss_film_id IS NULL THEN xref.rss_titleid
WHEN
isnull(pt.version_control_ind, 'N') = 'N' AND
xref.rss_prod_no IS NOT NULL AND
xref.rss_film_id IS NULL THEN substring(pc.glacct, 24, 5) -- ASR 3290687
WHEN isnull(pt.version_control_ind, 'N') = 'N' AND xref.rss_film_id IS NOT NULL THEN isnull(substring(pc.glacct, 24, 5), -- ASR 3290687
(
SELECT substring(dbo.ert_product.glacct, 24, 5) -- ASR 3290687
FROM dbo.ert_product
WHERE dbo.ert_product.product_id = a.parent_product_id
))
END
END in (select prod_no from #prod_no) or #prod_no = 0)
My first select statements is:
SELECT cRefNum, cName, cProgram || '-' || cCode || '-' || cSection as CourseDesc, cTimeStart, cTimeEnd, cDay, ct.cCampus, cBuildingSection || cRoom AS Room, cSchedType
from coursedetails cd inner join coursetimes ct
using (cRefNum)
where cRefNum = 3816;
Which results in:
My second select statements is:
select cRefNum, LISTAGG(fname|| ' ' || lname, ', ') within group (order by cRefNum) as Teachers
from teachers
where cRefNum = 3816
group by cRefNum;
Which results in:
What I'm trying to achieve is:
select a.cRefNum, cName, CourseDesc, cTimeStart, cTimeEnd, cDay, Campus, Room, cSchedType, Teachers
from
(select cRefNum, cName, cProgram || '-' || cCode || '-' || cSection as CourseDesc, cTimeStart, cTimeEnd, cDay, ct.cCampus as Campus, cBuildingSection || cRoom AS Room, cSchedType from coursedetails cd inner join coursetimes ct using (cRefNum) where cRefNum = 3816) a,
(select cRefNum, LISTAGG(fname|| ' ' || lname, ', ') within group (order by cRefNum) as Teachers from teachers where cRefNum = 3816 group by cRefNum) b
where a.cRefNum = b.cRefNum;
This fixes it, but is really long and I don't know enough to shorten it.
I want to place this working code within a SQL Statement, OR do I need to perform a UDF.
The result set is a one line concatenation, and I want it to be place in every one of the overall result set lines.
----
MAIN QUERY
SELECT
H.CONNECTION_ID,
H.SEQUENTIAL_NO,
H.INVOICE_NUMBER,
H.INVOICE_DATE,
H.LAST_INVOICE_NUMBER,
H.LAST_INVOICE_DATE,
CAST(CASE
WHEN H.COLLECT_DEPOSIT = 1 THEN '-'
ELSE CAST(H.PAYMENT_DUE_DATE AS NVARCHAR(20))
END AS SMALLDATETIME) AS PAYMENT_DUE,
H.JOB_NUMBER,
H.CUST_JOB_NUMBER,
HDR.SALES_PERSON,
H.INSIDE_SALES_PERSON,
H.IS_LAST_INVOICE,
CASE
WHEN H.COLLECT_DEPOSIT = 1 THEN 'CASH'
ELSE H.PAYMENT_TERMS_DESCRIPTION
END AS PAYMENT_TERMS,
H.PRINTED,
H.NOTES,
CUR.ID,
CUR.CODE,
CASE CUR.CODE
WHEN 'USD' THEN '001-106624-211'
WHEN 'EUR' THEN '001-106624-101'
WHEN 'GBP' THEN '001-106624-100'
ELSE '001-106624-001'
END AS BANK_ACCT,
CUR.EXCHANGE_RATE,
H.BILL_CONTACT,
H.CUST_ACCOUNT,
H.CUST_NAME,
H.CUST_ADDR1,
H.CUST_ADDR2,
H.CUST_CITY,
H.CUST_STATE,
H.CUST_ZIP,
H.CONTACT_PHONE_NUMBER,
H.CONTACT_PHONE_NUMBER2,
H.ORDERED_BY_CONTACT,
H.SHIP_TO_NAME,
H.SHIP_TO_ADDR1,
H.SHIP_TO_ADDR2,
H.SHIP_TO_CITY,
H.SHIP_TO_STATE,
H.SHIP_TO_ZIP,
H.SITE_PHONE_NUMBER,
H.SITE_PHONE_NUMBER2,
H.OFFICE_NAME,
H.OFFICE_ADDR1,
H.OFFICE_ADDR2,
H.OFFICE_CITY,
H.OFFICE_STATE,
H.OFFICE_ZIP,
H.OFFICE_PHONE_NUMBER,
H.OFFICE_FAX_NUMBER,
H.DELIVERY_TICKET_NUMBER,
H.PO_NUMBER,
H.DUMMY_INVOICE_TEXT,
(SELECT MESSAGE FROM REPORT_MESSAGES WHERE CODE = 'INVOICE') ADVERT_MESSAGE,
(SELECT MAX(DISCOUNT_PERCENTAGE) FROM PRTINVITEM I2 WHERE I2.CONNECTION_ID = H.CONNECTION_ID AND I2.INVOICE_NUMBER = H.INVOICE_NUMBER) AS MAX_DISCOUNT,
I.ITEM,
I.DESCRIPTION,
I.QUANTITY,
I.UNIT_OF_MEASURE,
I.MINIMUM_CHARGE,
I.WEEKLY_CHARGE,
I.MONTHLY_CHARGE,
I.START_OF_BILLING_PERIOD,
I.END_OF_BILLING_PERIOD,
I.DAYS_USED,
I.WEEKS_USED,
I.DISCOUNT_PERCENTAGE,
I.TAX_CODE_FOR_ITEM,
I.INVENTORY_TYPE,
I.BILLING_LOGIC_TYPE,
I.ACTUAL_WEEKLY_CHARGE_USED,
I.DAYS_IN_ACTUAL_WEEKLY_CHARGE,
II.CHARGEABLE_DAYS,
II.CHARGEABLE_WEEKS,
II.CHARGEABLE_MONTHS,
II.FREE_DAYS_THIS_INVOICE,
CNV.TOTAL_NET_VALUE,
CNV.TOTAL_TAX_VALUE,
CNV.TOTAL_GROSS_VALUE,
CNV.TOTAL_GROSS_VALUE_NS,
CNV.NET_LINE_VALUE,
CMP.EMAIL_ADDRESS
FROM (PRTINVHDR H INNER JOIN PRTINVITEM I ON H.CONNECTION_ID = I.CONNECTION_ID AND H.INVOICE_NUMBER = I.INVOICE_NUMBER)
INNER JOIN INVOICEHDR HDR ON I.INVOICE_NUMBER = HDR.INVNO
INNER JOIN CUSTOMERS CST ON H.CUST_ACCOUNT = CST.CUSTNUM
INNER JOIN JOB JOB ON H.JOB_NUMBER = JOB.JOBNUM
INNER JOIN CURRENCY CUR ON HDR.CURRENCY_ID = CUR.ID
INNER JOIN VWCURRENCYCONVERSION CNV ON I.CONNECTION_ID = CNV.CONNECTION_ID AND I.INVC_UCOUNTER = CNV.INVC_UCOUNTER
INNER JOIN COMPANY CMP ON H.OFFICE_CODE = CMP.OFFICE
INNER JOIN INVOICEITEM II ON I.INVOICE_NUMBER = II.INVNO AND I.INVC_UCOUNTER = II.INVC_UCOUNTER
ORDER BY
H.SEQUENTIAL_NO,
I.PRINT_SEQUENCE
ASC
----
COALESCE QUERY
DECLARE
#DTICKET NVARCHAR(20),
#PUMPCATEGORYNAME NVARCHAR(3999)
SET #DTICKET = ''
SET #PUMPCATEGORYNAME = NULL
(SELECT
#DTICKET = DTICKET,
#PUMPCATEGORYNAME = COALESCE(#PUMPCATEGORYNAME + ', ', '' ) + PUMPCATEGORYNAME
FROM (SELECT
BHDR.DTICKET,
SCD.PUMPCATEGORYNAME
FROM PRTTICKHDR PHDR
INNER JOIN BIDHDR BHDR ON PHDR.DELIV_TICKET_NUMBER = BHDR.DTICKET
INNER JOIN PRTTICKITEM PITM ON PHDR.CONNECTION_ID = PITM.CONNECTION_ID AND PHDR.DELIV_TICKET_NUMBER = PITM.DELIV_TICKET_NUMBER
LEFT JOIN SUBCATEGORYDESCRIPTION SCD ON PITM.ITEM = SCD.PUMPCATEGORY
WHERE SCD.PUMPCATEGORYNAME IS NOT NULL)
SUBCATEGORYDESCRIPTION)
SELECT #DTICKET, #PUMPCATEGORYNAME
Not really sure what you are asking for but you can doing something along the lines of
Select col1 + ', ' + col2 + ', ' + col3 etc....