2017-05-03 65 views
0

我有两个CTE的,首先如何通过组合两个CTE来获得期望的结果?

;WITH CTE AS (SELECT A.* 
        , Row_NUMBER() Over (Partition by ID order by Date asc) RN 
      FROM TABLE A) 
    SELECT Sum(Weight) as IN_WT 
    FROM CTE 
    WHERE RN = 1 and name='dev1' 

然后

;WITH CTE AS (SELECT B.* 
        , Row_NUMBER() Over (Partition by ID order by Date desc) RN1 
      FROM TABLE B) 
    SELECT Sum(Weight) AS out_wt 
    FROM CTE 
    WHERE RN1 = 1 and name='dev1' 

现在我有一个reuiremnt输出应结合起来,并得到in_wt,out_wt.I试图结合两者的CTE的,但没”没有达到预期的结果。我们该怎么做?

+0

相结合,怎么样?你尝试了什么,你期望什么,结果如何?此外,为什么当两个查询使用相同的CTE时,您需要两个* CTE?难道你不应该想办法在同一个'SELECT'子句中创建两个单独的总和吗? (非常强大的提示) –

回答

0

这是简单的解决办法,我发现,

“快速&脏”的做法将是两个包裹你的查询在其他两种CTE的SELECT (SELECT IN_WT FROM CTE1), (SELECT OUT_WT FROM CTE2)

0

如果这两个热膨胀系数访问相同表,暗示在问题的疑问,那么你可以使用下面的查询,以获得期望的结果:

;WITH CTE AS (
    SELECT *, 
      Row_NUMBER() Over (Partition by ID order by Date asc) RN1, 
      Row_NUMBER() Over (Partition by ID order by Date desc) RN2 
    FROM TABLE 
) 
SELECT SUM(CASE WHEN RN1 = 1 THEN Weight ELSE 0 END) as IN_WT, 
     SUM(CASE WHEN RN2 = 1 THEN Weight ELSE 0 END) as OUT_WT 
FROM CTE 
WHERE 1 IN (RN1, RN2) AND name = 'dev1' 
+0

这里我们使用两个表 –

+1

@saibharath一个'快速和肮脏'的方法将两个包装你的查询在其他两个CTE,所以像...... SELECT(SELECT IN_WT FROM CTE1),(SELECT OUT_WT FROM CTE2 )'。 –

0

您有2个表和有它们之间没有任何关系。 然后结合2查询简单地像

;WITH cteA AS (SELECT A.* 
       , Row_NUMBER() Over (Partition by ID order by Date asc) RN 
      FROM TABLEA A), 
     cteB AS (SELECT B.* 
       , Row_NUMBER() Over (Partition by ID order by Date desc) RN 
      FROM TABLEB B) 
SELECT 
     ( SELECT Sum(Weight) 
     FROM cteA 
     WHERE RN = 1 and name='dev1' 
    ) as IN_WT, 
     ( SELECT Sum(Weight) 
     FROM cteB 
     WHERE RN = 1 and name='dev1' 
    ) as OUT_WT 
相关问题