【问题标题】:Join One Table with Other Table for Every Row Type将每个行类型的一个表与另一个表连接起来
【发布时间】:2015-08-20 18:33:24
【问题描述】:

我的第一个表及其数据是:

DECLARE @TempTableA TABLE (FinYearVal VARCHAR(9))

FinYearVal
----------
2007-2008
2008-2009
2009-2010
2010-2011
2011-2012
2012-2013
2013-2014
2014-2015

然后我有另一个数据表:

DECLARE @TempTableB TABLE (Category VARCHAR(10), FinYear VARCHAR(9), AMOUNT NUMERIC(18,10))

Category   FinYear       AMOUNT
---------- ------------- ----------
A          2013-2014     100.0000
A          2014-2015     200.0000
B          2012-2013     100.0000
B          2013-2014     200.0000
B          2014-2015     300.0000
B          2015-2016     400.0000
C          2011-2012     100.0000
C          2012-2013     200.0000

我希望我的 Table1 与每个类别的 Table2 右连接,就像我们分别右连接和联合数据一样。
预期结果是:

Category   FinYearVal     AMOUNT
---------- ----------     ----------
A          2007-2008      0.0000
A          2008-2009      0.0000
A          2009-2010      0.0000
A          2010-2011      0.0000
A          2011-2012      0.0000
A          2012-2013      0.0000
A          2013-2014      100.0000
A          2014-2015      200.0000
B          2007-2008      0.0000
B          2008-2009      0.0000
B          2009-2010      0.0000
B          2010-2011      0.0000
B          2011-2012      0.0000
B          2012-2013      100.0000
B          2013-2014      200.0000
B          2014-2015      300.0000
C          2007-2008      0.0000
C          2008-2009      0.0000
C          2009-2010      0.0000
C          2010-2011      0.0000
C          2011-2012      100.0000
C          2012-2013      200.0000
C          2013-2014      0.0000
C          2014-2015      0.0000

注意:我的 Table2 有许多类别,我可以在其中动态选择要在查询中加入多少个类别。

【问题讨论】:

  • 有类别表吗?

标签: sql sql-server join cross-apply


【解决方案1】:

试试这个

SELECT C.Category,A.FinYearVal, ISNULL(B.AMOUNT,0) AS AMOUNT
FROM @TempTableA A
CROSS JOIN (SELECT DISTINCT Category FROM @TempTableB) C
LEFT JOIN @TempTableB B ON B.Category = C.Category AND B.FinYear = A.FinYearVal

【讨论】:

    【解决方案2】:
    SELECT t.FinYearVal, t.Category, ISNULL(ttb.AMOUNT,0)
    FROM (
        SELECT tta.FinYearVal, d.Category
        FROM @TempTableA tta
        CROSS JOIN (SELECT DISTINCT ttb.Category FROM @TempTableB ttb) AS d
    ) AS t
    LEFT OUTER JOIN @TempTableB ttb ON t.FinYearVal = ttb.FinYear AND ttb.Category = t.Category
    ORDER BY t.Category, t.FinYearVal
    

    如果您有特殊的 Category 表,可以通过将 distinct 上的 cross join 替换为该表上的 cross join 来改进查询

    【讨论】:

      【解决方案3】:

      你可以试试这个吗?

      select t1.category,t1.finyearval,coalesce(t2.amount,0) from
      (
      select t1.category,t2.finyearval from @TempTableB as t1 inner join @TempTableA as t2 on 1=1
      ) as t1 left join @TempTableB as t2 on t1.finyearval=t2.finyear and t1.Category=t2.Category
      

      【讨论】:

      • 结果中有重复值
      • @Backs 你能澄清一下你的意思吗?
      • @Backs 它不是重复的。这就是我想要的。
      • @Madhivanan 对不起,伙计!但查询给了我错误的输出。如问题所示,我需要 24 条记录,但它返回了 64 条记录。
      • @DineshSaxena 我写了同样的评论:o)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2021-01-11
      相关资源
      最近更新 更多