问题描述
我的查询是
SELECT (
SELECT invoice_custom_fieldvalue FROM ip_invoice_custom WHERE invoice_id ='2474' AND invoice_custom_fieldid = '9'
) AS 'Claim Number',(
SELECT invoice_custom_fieldvalue FROM ip_invoice_custom WHERE invoice_id ='2474' AND invoice_custom_fieldid = '7'
) AS 'Client Name',(
SELECT invoice_custom_fieldvalue FROM ip_invoice_custom WHERE invoice_id ='2474' AND invoice_custom_fieldid = '8'
) AS 'Employer',(
SELECT invoice_item_subtotal FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Invoice Amount',(
SELECT invoice_item_tax_total FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Tax',(
SELECT invoice_item_subtotal FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Tax1',(
SELECT CONCAT('CAD') FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Currency',(
SELECT invoice_date_created FROM ip_invoices WHERE invoice_id ='2474'
) AS 'Date',(
SELECT client_name FROM ip_clients c INNER JOIN ip_invoices i ON c.client_id = i.client_id WHERE i.invoice_id ='2474'
) AS 'Requested by',(
SELECT item_description FROM ip_invoice_items p WHERE p.invoice_id
) AS 'Transaction Subtype';
这是没有最后选择的结果:
Claim Number Client Name Employer Invoice Amount Tax Tax1 Currency Date Requested by
12345 John Smith NULL 3326.99 0.00 0.00 CAD 2019-12-04 ATTN: Joe Smith
ip_invoice_items表如下:
item_id invoice_id item_description
1 2474 Some product
2 2474 Some other product
3 2474 Some other other product
所需的输出:
Claim Number Client Name Employer Invoice Amount Tax Tax1 Currency Date Requested by Item Description
12345 John Smith NULL 3326.99 0.00 0.00 CAD 2019-12-04 ATTN: Joe Smith Some product
12345 John Smith NULL 3326.99 0.00 0.00 CAD 2019-12-04 ATTN: Joe Smith Some other product
12345 John Smith NULL 3326.99 0.00 0.00 CAD 2019-12-04 ATTN: Joe Smith Some other other product
每个invoice_id(最后选择语句)有多个项目描述。我该如何重写它,以便得到将为每个项目描述添加行的结果?
解决方法
涉及5个表,您可以以ip_invoice_custom
开头,而LEFT
可以加入另外4个表:
SELECT ic.`Claim Number`,ic.`Client Name`,ic.`Employer`,ia.invoice_item_subtotal `Invoice Amount`,ia.invoice_item_tax_total `Tax`,ia.invoice_item_subtotal `Tax1`,'CAD' `Currency`,i.invoice_date_created `Date`,c.client_name `Requested by`,ii.item_description `Transaction Subtype`
FROM (
SELECT invoice_id,MAX(CASE WHEN invoice_custom_fieldid = '9' THEN invoice_custom_fieldvalue END) `Claim Number`,MAX(CASE WHEN invoice_custom_fieldid = '7' THEN invoice_custom_fieldvalue END) `Client Name`,MAX(CASE WHEN invoice_custom_fieldid = '8' THEN invoice_custom_fieldvalue END) `Employer`
FROM ip_invoice_custom
WHERE invoice_id ='2474' AND invoice_custom_fieldid IN ('7','8','9')
GROUP BY invoice_id
) ic
LEFT JOIN ip_invoice_amounts ia ON ia.invoice_amount_id = ic.invoice_id
LEFT JOIN ip_invoices i ON i.invoice_id = ic.invoice_id
LEFT JOIN ip_clients c ON c.client_id = i.client_id
LEFT JOIN ip_invoice_items ii ON ii.invoice_id = ic.invoice_id
,
您可以通过加入发票ID上的表格,用一个选择语句完成所有这些操作。对于自定义表,您可以将该表连接3次以获得每个自定义值的值。
这是一个大概的草图:
events
我不确定您对货币行的处理方式,因此可能需要对其进行编辑,但这会在一个选择语句中完成整个搜索。
使用原始代码,您还可以将选择语句与ip_invoice_items表连接。您可以将较大的选择语句(不包括最后一个子选择)与ip_invoice_table结合使用,其中ip_invoice_id等于要查找的值。这是您可以做什么的粗略草图:
SELECT cn1.invoice_custom_fieldvalue as 'Claim Number',cn2.invoice_custom_fieldvalue as 'Client Name',em.invoice_custom_fieldvalue as 'Employer',ip_invoice_amounts.invoice_item_subtotal as 'Invoice Amount',ip_invoice_amounts.invoice_item_tax_total as 'Tax',CONCAT('CAD') as 'Currency',ip_clients.client_name as 'Requested by',ip_invoice_items.item_description as 'Transaction Subtype'
FROM ip_invoice_custom cn1
JOIN ip_invoice_custom cn2
ON cn1.invoice_id=cn2.invoice_id
JOIN ip_voice_custom em
ON cn1.invoice_id=em.invoice_id
JOIN ip_invoice_amounts
ON cn1.invoice_id=invoice_amounts.invoice_amount_id
JOIN ip_invoices
ON cn1.invoice_id=ip_invoices.invoice_id
JOIN ip_clients
ON ip_invoices.client_id=ip_clients.client_id
JOIN ip_invoice_items
ON cn1.invoice_id=ip_invoice_items.invoice_id
WHERE cn1.invoice_custom_fieldid = '9'
AND cn2.invoice_custom_fieldid = '7'
AND em.invoice_custom_fieldid = '8'
AND cn1.invoice_id = '2474';
在括号中,您可以包括较大的select语句。我还建议为sub_select语句提供非字符串名称,并美化外部select语句中的输出。