【问题标题】:SQL Joining Two StatementsSQL 连接两个语句
【发布时间】:2014-02-18 19:04:33
【问题描述】:

我还没有发现这么大的 SQL 连接问题,这就是问题所在:我有两个 SQL 语句,一个将资金投入到不同的组中,另一个获得在这些组中花费的资金,如何我会将它们连接在一起,以便一起显示“预算”和“费用”吗? 几乎没有部门,资金类别,预算和部门,资金类别,费用表,我想要一个部门,资金类别,预算,费用表。

SELECT st.name as "Department", sft.longname as "Funding Category", sum(sf.amount) as "Budget" 
FROM 
money_type as st, 
money_funding_type as sft, 
money_funding as sf 
WHERE 
st.ID = sf.type_ID AND 
sft.ID = sf.funding_ID 
GROUP BY 
sf.type_id, sf.funding_id 

SELECT st.name as "Department", sft.longname as "Funding Category", sum(si.amount) as "Expenses" 
FROM 
money_type as st, 
money_funding_type as sft, 
money_invoice as si 
WHERE 
st.ID = si.type_ID AND 
sft.ID = si.funding_ID 
GROUP BY 
si.type_id, si.funding_id

【问题讨论】:

    标签: php sql join


    【解决方案1】:

    怎么样

    SELECT  st.name as "Department", 
            COALESCE(sft.longname,sfti.longname) as "Funding Category", 
            sum(sf.amount) as "Budget",
            sum(si.amount) as "Expenses" 
    FROM    money_type as st LEFT JOIN
    
            money_funding as sf  ON st.ID = sf.type_ID LEFT JOIN
            money_funding_type as sft ON sft.ID = sf.funding_ID LEFT JOIN
    
            money_invoice as si ON st.ID = si.type_ID LEFT JOIN
            money_funding_type as sfti  ON sfti.ID = si.funding_ID
    GROUP BY    st.name, 
                COALESCE(sft.longname,sfti.longname)
    

    【讨论】:

    • 终于完成了,还是不行。如果费用的值应该是 475.9,则为 951.8,如果值应返回 26452.19,则返回 72388013.48009163
    • 向我们展示您的实际表结构和一些示例数据,我们可以看看。根据您提供的查询,这是最好的努力。
    【解决方案2】:

    您可以尝试以下方法。第一个查询“AllTypes”是获取可用数据的不同 ID/类型,而不是笛卡尔。从中,简单连接到类型和资金类型以获取描述。

    然后,另外两个选择简化了他们自己的 money_funding / money_invoice 元素,只获取他们的“id”字段和金额总和,因此对于每个预算和费用,每种类型/资金都有 1 条记录。然后将它们左连接到“AllTypes”,如果它们有相应的值,则获取结果,否则为 0。

    连接之间的额外换行符仅供阅读

    SELECT
          st.name as "Department", 
          sft.longname as "Funding Category", 
          coalesce( Budgets.Budget, 0 ) as Budget,
          coalesce( Expenses.Expense, 0 ) as Expense,
          coalesce( Budgets.Budget, 0 ) - coalesce( Expenses.Expense, 0 ) as AmtRemain
       from 
          ( select distinct
                  type_id,
                  funding_id
               from
                  money_funding
            union
            SELECT distinct
                  type_id,
                  funding_id
               from
                  money_invoice  ) AllTypes
    
             JOIN money_type as st
                ON AllTypes.type_id = st.id
    
             JOIN money_funding_type as sft
                ON AllTypes.funding_id = sft.id
    
             LEFT JOIN ( SELECT 
                               sf.type_id,
                               sf.funding_id,
                               sum(sf.amount) as "Budget" 
                            FROM 
                               money_funding as sf 
                            GROUP BY 
                               sf.type_id, 
                               sf.funding_id ) Budgets
                ON AllTypes.type_id = Budgets.Type_id
                AND AllTypes.funding_id = Budgets.Funding_ID
    
             LEFT JOIN ( SELECT 
                               si.type_id, 
                               si.funding_id,
                               sum(si.amount) as "Expense" 
                            FROM 
                               money_invoice as si 
                            GROUP BY 
                               si.type_id, 
                               si.funding_id ) Expenses
                ON AllTypes.type_id = Expenses.Type_id
                AND AllTypes.funding_id = Expenses.Funding_ID
    

    “AllTypes”查询,您可能需要删除第二个“DISTINCT”子句,因为第一个子句可能适用于整个“AllTypes”查询并且可能会给您一个错误。

    【讨论】:

      【解决方案3】:

      使用 FULL OUTER JOIN 同时加入 Invoice 和 Funding,然后按 moneytype、funding 和 invoice 分组。

      【讨论】:

      • 你能给我它的 SQL 吗?我做的是 PHP 而不是 SQL,我真的不知道它是如何工作的。
      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2016-06-21
      • 2018-12-16
      • 2012-07-10
      • 1970-01-01
      相关资源
      最近更新 更多