【问题标题】:SQL query to join two different queries with different number of columnsSQL查询以连接具有不同列数的两个不同查询
【发布时间】:2018-03-28 08:00:46
【问题描述】:

我有两个问题:

查询 1:

SELECT allowdeductname_en, SUM(SFD_comp_value_tax@;emp_id) as                                                                                                                                      
GGG                                                                                                                                                                                                 
FROM TPYDPROCMTDD md                                                                                       
LEFT JOIN TPYDPROCMTDH mh on md.procmtdh_id = mh.procmtdh_id and 
md.company_id = mh.company_id                                                                                                                                                                                                                                                    
WHERE md.allowdeducttype = 'A'                                                                                                                                                                                                                                                     
AND md.company_id = '13565'
AND mh.company_id = '13565'
AND year(mh.paydate) = 2017                                                           
AND month(mh.paydate) = 1 
AND mh.costcenter_code = 99990001
group by allowdeductname_en
order by allowdeductname_en

查询 2:

SELECT distinct allowdeductname_en                                                                                                                                                                                              
FROM TPYDPROCMTDD md                                                                                       
LEFT JOIN TPYDPROCMTDH mh on md.procmtdh_id = mh.procmtdh_id and 
md.company_id = mh.company_id                                                                                                                                                                                                                                                    
WHERE md.allowdeducttype = 'A'                                                                                                                                                                                                                                                     
AND md.company_id = '13565'
AND mh.company_id = '13565'
AND year(mh.paydate) = 2017                                                           
AND month(mh.paydate) = 1
order by allowdeductname_en 

查询 1 和查询 2 的结果:

我是否可以将这两个查询相交、连接或联合,使其看起来像这样:

预期结果:

我尝试了很多不同的方法,但仍然无法获得我想要的结果。伙计们请帮忙!

【问题讨论】:

  • 编辑您的问题并将示例数据和所需结果作为文本放入问题中。
  • 只需添加一个额外的列:cast(null as int) as ggg
  • 轻松为您提供帮助。保持列名和数据简短易读,即使我们不会说您的语言。
  • 您可以简单地将查询 1 外连接到查询 2。但是,您的查询没有正确编写。例如,您的外部联接不起作用(也许它们甚至不应该起作用)。我想你可以写一个更简单的查询。 allowdeductname_en 驻留在哪个表中?而SUM(SFD_comp_value_tax@;emp_id) 可能是一个错字。你能纠正一下吗?

标签: sql sql-server database


【解决方案1】:

嗯,这是最直接的解决方案:

select * from (/*query number 2*/) [a]
left join (/*query number 1*/) [b] 
on [a].allowdeductname_en = [b].allowdeductname_en

但是您可以在一个查询中完成它,因为两个查询都使用同一个表,但是为了提供该解决方案,我需要查看您的数据。

【讨论】:

    【解决方案2】:
    select t2.allowdeductname_en, GGG=isnull(t1.GGG,0)
     from 
    (SELECT distinct allowdeductname_en                                                                                                                                                                                              
    FROM TPYDPROCMTDD md                                                                                       
    LEFT JOIN TPYDPROCMTDH mh on md.procmtdh_id = mh.procmtdh_id and 
    md.company_id = mh.company_id                                                                                                                                                                                                                                                    
    WHERE md.allowdeducttype = 'A'                                                                                                                                                                                                                                                     
    AND md.company_id = '13565'
    AND mh.company_id = '13565'
    AND year(mh.paydate) = 2017                                                           
    AND month(mh.paydate) = 1 ) t2
    
    LEFT JOIN 
    
    (SELECT allowdeductname_en, SUM(SFD_comp_value_tax@;emp_id) as                                                                                                                                      
    GGG                                                                                                                                                                                                 
    FROM TPYDPROCMTDD md                                                                                       
    LEFT JOIN TPYDPROCMTDH mh on md.procmtdh_id = mh.procmtdh_id and 
    md.company_id = mh.company_id                                                                                                                                                                                                                                                    
    WHERE md.allowdeducttype = 'A'                                                                                                                                                                                                                                                     
    AND md.company_id = '13565'
    AND mh.company_id = '13565'
    AND year(mh.paydate) = 2017                                                           
    AND month(mh.paydate) = 1 
    AND mh.costcenter_code = 99990001
    group by allowdeductname_en)  t1 on t2.allowdeductname_en=t1.allowdeductname_en
    
    
    this is not the best query but it give you the result you want. 
    

    【讨论】:

    • 你是个天才。谢谢您的帮助。干杯!
    【解决方案3】:

    您可以在两者之间使用LEFT JOINISNULL

    ;WITH FirstQuery AS
    (
        SELECT 
            allowdeductname_en, 
            SUM(SFD_comp_value_tax@;emp_id) as    GGG                                                                                                                                                                                                 
        FROM TPYDPROCMTDD md                                                                                       
        LEFT JOIN TPYDPROCMTDH mh on md.procmtdh_id = mh.procmtdh_id and 
        md.company_id = mh.company_id                                                                                                                                                                                                                                                    
        WHERE md.allowdeducttype = 'A'                                                                                                                                                                                                                                                     
        AND md.company_id = '13565'
        AND mh.company_id = '13565'
        AND year(mh.paydate) = 2017                                                           
        AND month(mh.paydate) = 1 
        AND mh.costcenter_code = 99990001
        group by allowdeductname_en
    ),
    SecondQuery AS
    (
        SELECT distinct allowdeductname_en                                                                                                                                                                                              
        FROM TPYDPROCMTDD md                                                                                       
        LEFT JOIN TPYDPROCMTDH mh on md.procmtdh_id = mh.procmtdh_id and 
        md.company_id = mh.company_id                                                                                                                                                                                                                                                    
        WHERE md.allowdeducttype = 'A'                                                                                                                                                                                                                                                     
        AND md.company_id = '13565'
        AND mh.company_id = '13565'
        AND year(mh.paydate) = 2017                                                           
        AND month(mh.paydate) = 1
    )
    SELECT
        S.allowdeductname_en,
        ISNULL(N.GGG, 0) AS GGG
    FROM
        SecondQuery AS S
        LEFT JOIN FirstQuery AS N ON S.allowdeductname_en = N.allowdeductname_en
    

    【讨论】:

      【解决方案4】:

      查询仅在条件costcenter_code = 99990001 上有所不同。将此移动到您的聚合函数SUM

      select allowdeductname_en,
        sum(case when mh.costcenter_code = 99990001 then sfd_comp_value_tax end) as ggg
      from tpydprocmtdd md
      left join tpydprocmtdh mh on md.procmtdh_id = mh.procmtdh_id
                                and md.company_id = mh.company_id
                                and year(mh.paydate) = 2017
                                and month(mh.paydate) = 1
      where md.allowdeducttype = 'A'
      and md.company_id = 13565
      group by allowdeductname_en
      order by allowdeductname_en;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 1970-01-01
        相关资源
        最近更新 更多