【问题标题】:Joining two queries horizontally水平连接两个查询
【发布时间】:2012-03-29 09:17:20
【问题描述】:

我在下面写了两个查询,每个查询产生一行数据。

将它们组合在一起的最佳方法是什么,使得我 LEFT 只有一行数据?

这些即将到来 FROM 两个 DISTINCT databases 命名为:[ASN01] 和 [dsi_ASN_dsicx]

我有 70 对这样的数据库,但为了简单起见,我只展示了一个。

三个字母的首字母缩写词 ASN 对于两个数据库名称是通用的这一事实没有错,如果需要,可以作为解决方案的一部分。

当前结果:

网站、Elligence(标题) ASN,100.00

站点,GP_Total(标题) ASN,120.00

期望的结果:

站点、GP_Total、Elligence(标题) ASN, 120.00, 100.00

SELECT  'ASN' AS Site ,
        CASE SUM(perdblnc)
          WHEN NULL THEN 0
          ELSE -1 * SUM(PERDBLNC)
        END AS GP_Total
FROM    [ASN01].[dbo].[GL10110] T1
        LEFT OUTER JOIN [ASN01].[dbo].[GL00105] T2 ON [T1].[ACTINDX] = [T2].[ACTINDX]
WHERE   YEAR1 = 2012
        AND PERIODID IN ( '2' )
        AND ACTNUMST IN ( '4200-0000-C', '6940-0000-C', '6945-0000-C',
                          '6950-0000-C' )

SELECT  'ASN' AS [Site] ,
        SUM(pi.amount) AS [Elligence]
FROM    [dsi_ASN_dsicx].dbo.charge c
        LEFT JOIN [dsi_ASN_dsicx].dbo.paymentitem pi ON c.idcharge = pi.chargeid
        LEFT JOIN [dsi_ASN_dsicx].dbo.payment p ON pi.paymentid = p.idpayment
        LEFT JOIN [dsi_ASN_dsicx].dbo.paymenttype pt ON p.paymenttypeid = pt.idpaymenttype
WHERE   pi.amount != 0
        AND pt.paymentmethod NOT IN ( '5', '7' )
        AND pt.paymentmethod IS NOT NULL
        AND p.sdate >= '20120201'
        AND p.sdate <= '20120229'

【问题讨论】:

  • 这看起来像是两组不同的数据。什么定义了公共行?这些查询甚至产生相同数量的行吗?
  • 它在帖子中说他从每个查询@Blam 中只得到一行。他希望他们排成一排。

标签: sql-server tsql merge


【解决方案1】:

在不执行和更改任何查询的情况下,最简单的方法是使用 "WITH" common_table_expression 的临时表。 Table1 和 Table2 是从您的 select 语句创建的临时表。因此,我们选择table1并加入table2。

如果有任何语法问题,请告诉我,我目前没有任何东西可以测试。

;With Table1 as (SELECT 'ASN' as Site, Case sum(perdblnc) 
WHEN NULL THEN 0 
ELSE -1*sum(PERDBLNC) END as GP_Total  
FROM [ASN01].[dbo].[GL10110] T1
Left Outer Join [ASN01].[dbo].[GL00105]  T2
ON [T1]. [ACTINDX]= [T2]. [ACTINDX]
WHERE YEAR1 = 2012
AND PERIODID in ('2')
AND ACTNUMST in ('4200-0000-C', '6940-0000-C', '6945-0000-C', '6950-0000-C'))

, Table2 as (SELECT 
    'ASN' as [Site],
    SUM(pi.amount) as [Elligence]
FROM [dsi_ASN_dsicx].dbo.charge c
    LEFT JOIN [dsi_ASN_dsicx].dbo.paymentitem pi on c.idcharge = pi.chargeid
    LEFT JOIN [dsi_ASN_dsicx].dbo.payment p on pi.paymentid = p.idpayment
    LEFT JOIN [dsi_ASN_dsicx].dbo.paymenttype pt on p.paymenttypeid = pt.idpaymenttype
WHERE pi.amount != 0
AND pt.paymentmethod not in ('5','7')
AND pt.paymentmethod is not null
AND p.sdate >='20120201' and p.sdate <= '20120229')

SELECT * FROM Table1
LEFT JOIN Table2 ON Table1.site = Table2.site

希望这会有所帮助!如果是则标记为答案 =)

【讨论】:

  • +1 用于回答一个完全不同的问题。我在想也许它应该是一个 FULL JOIN,我不知道是否有任何一个可能缺席。在最终连接中不需要 ON 子句(ON Table1.site = Table2.site)吗?
  • 这个解决方案完美无缺!语法非常适合 MS SSMS。非常感谢您的帮助。
  • 没问题。乐意效劳! =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多