每个行类型加入一个表与其他表

时间:2015-08-20 10:02:26

标签: sql sql-server join cross-apply

My First Table及其数据是:

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有很多类别,我会动态选择我想在查询中加入多少个类别。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

如果你有特殊的分类表,可以通过在此表上用交叉连接替换不同的交叉连接来实现查询

答案 2 :(得分:0)

你能试试吗?

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