2015-10-05 90 views
0

我正在使用SQLite並擁有3個表,項目,發票和訂單。我有一個基於項目表的select語句,它挑選存儲在這個表中的字段,但是我還想要特定項目的發票總金額和特定項目的訂單總金額。我知道如何單獨獲取所有值,但是我還沒有弄清楚如何將訂單/發票的總和值存入項目數據行。它是我需要搜索的嵌套選擇還是其他概念?從另一個表中選擇具有總和值的查詢

選擇基於項目表

SELECT project.projectID, project.project_title, project.end_date, project.project_manager, project_status.project_status 
FROM project 
LEFT JOIN project_status 
ON project.project_statusID=project_status.project_statusID 
WHERE project.project_statusID BETWEEN 1 AND 12 

選擇按發票表,其中x是從項目ID的第一選擇

SELECT sum(invoice_net) 
FROM invoice 
WHERE projectID= x 

選擇基於順序表,其中x是該項目從第一選擇的ID

SELECT sum(total_order) 
FROM order 
WHERE projectID = x 

回答

1

您沒有提供樣本數據,甚至沒有提供gh你的數據庫模式的答案來提供你需要的確切的SQL。

您不描述發票或訂單表。我必須假設他們包含一個ProjectID屬性。

你可以使用子查詢:

http://www.techrepublic.com/article/use-sql-subselects-to-consolidate-queries/1045787/ https://msdn.microsoft.com/en-us/library/ff487138.aspx

你選擇威力變成類似(未經測試):

SELECT 
    project.projectID, 
    project.project_title, 
    project.end_date, 
    project.project_manager, 
    project_status.project_status, 
    (SELECT sum(invoice.invoice_net) FROM invoice WHERE invoice.projectID = project.projectID), 
    (SELECT sum(order.total_order) FROM order WHERE order.projectID = project.projectID) 
FROM project 
LEFT JOIN project_status 
    ON project.project_statusID=project_status.project_statusID 
WHERE project.project_statusID BETWEEN 1 AND 12 

或一組由聯接。請參閱:

SQL JOIN, GROUP BY on three tables to get totals

您將通過有組中的所有非聚合(通常這將是你從你的項目表中選擇所有字段),然後應用聚合函數(SUM)到您的詳細信息屬性(invoice_net和total_order)。

像這樣(未經):

SELECT 
    project.projectID, 
    project.project_title, 
    project.end_date, 
    project.project_manager, 
    project_status.project_status, 
    sum(invoice.invoice_net), 
    sum(order.total_order) 
FROM project 
LEFT JOIN project_status 
    ON project.project_statusID=project_status.project_statusID 
LEFT JOIN invoice 
    ON project.projectID = invoice.projectID 
LEFT JOIN order 
    ON project.projectID = order.projectID 
WHERE project.project_statusID BETWEEN 1 AND 12 
GROUP BY project.projectID, project.project_title, project.end_date, 
    project.project_manager, project_status.project_status 

選擇哪一個?性能應該與具有可比性,但是查詢優化器中的弱點可能會導致優先於其他優先級。測試性能如果這很重要。

對於一次性,如果連接表的視圖不存在,我可能會使用子查詢。但是在實踐中,一個視圖確實存在或者應該存在,在這種情況下,使用GROUP BY(或者創建視圖,如果需要的話)是非常自然的。

所以真正的答案就(未經測試):

CREATE VIEW project_order_invoice AS 
SELECT 
    project.projectID, 
    project.project_title, 
    project.end_date, 
    project.project_manager, 
    project_status.project_status, 
    invoice.invoice_net, 
    order.total_order 
FROM project 
LEFT JOIN project_status 
    ON project.project_statusID=project_status.project_statusID 
LEFT JOIN invoice 
    ON project.projectID = invoice.projectID 
LEFT JOIN order 
    ON project.projectID = order.projectID 


SELECT 
    projectID, 
    project_title, 
    end_date, 
    project_manager, 
    project_status, 
    sum(invoice_net), 
    sum(total_order) 
FROM project_order_invoice 
WHERE project_statusID BETWEEN 1 AND 12 
GROUP BY projectID, project_title, end_date, 
    project_manager, project_status 

對於視圖,你可能會想包括來自所有表的屬性,除了只有1 ID屬性的副本。

+0

謝謝,我會閱讀子選集。是的,兩個相關都有一個projectID字段 – JK36

相關問題