需要来自同一查询的两个不同结果

Need two different results from the same query

我正在检查一个月的初始余额和最终余额,我想出了一个查询来获取其中一个,但我需要在同一个查询中显示两个结果。我无法执行子查询,因为我在查询中使用了 GROUP BY,据我所知,我无法在执行子查询时使用它。我将不胜感激更有经验的 SQL 用户提供的任何指示或建议。

DECLARE @Year INT SET @Year = 2016
DECLARE @Month varchar(4) SET @Month = '07'

SELECT T2.[Segment_0]+'-'+T2.[Segment_1]+'-'+T2.[Segment_2] Account,
T2.[AcctName], 
SUM(T0.[Debit])-SUM(T0.[Credit]) Balance
FROM  JDT1 T0  
INNER  JOIN OJDT T1  
ON  T1.[TransId] = T0.[TransId] 
INNER JOIN oact T2
ON T2.[AcctCode] = T0.[Account]
where t0.RefDate >= @From and convert(varchar(7), T0.RefDate ,111) < LTRIM(str(@Year)) + '/' + @Month --Initial
--where t0.RefDate >= @From and convert(varchar(7), T0.RefDate ,111) <= LTRIM(str(@Year)) + '/' + @Month --Final
GROUP BY T2.[Segment_0]+'-'+T2.[Segment_1]+'-'+T2.[Segment_2],T2.[AcctName]
order by T2.[Segment_0]+'-'+T2.[Segment_1]+'-'+T2.[Segment_2]

如您所见,这只是 LESS THANLESS OR EQUAL THAN 问题,但我的查询中需要这两个结果。我缺乏经验让我为此伤脑筋。

如果两者都需要,则只需使用 <=<= 将获得 < 的所有行,再加上一些...因此使用 < 是多余的。除了这个操作数之外,您的 where 子句是相同的。

编辑

试试这个....

SELECT 
    T2.[Segment_0]+'-'+T2.[Segment_1]+'-'+T2.[Segment_2] Cuenta,
    T2.[AcctName], 
    ISNULL((select SUM([Debit]) - SUM([Credit]) from JDT1 where TransId = T0.TransID and RefDate >= @From and convert(varchar(7), RefDate ,111) < LTRIM(str(@Year)) + '/' + @Month),0) as [Initial Saldo Final],
    ISNULL((select SUM([Debit]) - SUM([Credit]) from JDT1 where TransId = T0.TransID and RefDate >= @From and convert(varchar(7), RefDate ,111) <= LTRIM(str(@Year)) + '/' + @Month),0) as [Final Saldo Final]
FROM    
    JDT1 T0  
    INNER  JOIN OJDT T1 ON
    T1.[TransId] = T0.[TransId] 
    INNER JOIN oact T2 ON
    T2.[AcctCode] = T0.[Account]
order by T2.[Segment_0]+'-'+T2.[Segment_1]+'-'+T2.[Segment_2]

也许这会起作用..我确定如果我们对数据结构有更好的了解,我们可以提出一些可行的子查询

DECLARE @Year INT
SET @Year = 2016
DECLARE @Month VARCHAR(4)
SET @Month = '07'

SELECT  T2.[Segment_0] + '-' + T2.[Segment_1] + '-' + T2.[Segment_2] Account,
        T2.[AcctName],
        SUM(CASE WHEN CONVERT(VARCHAR(7),T0.RefDate,111) < LTRIM(STR(@Year)) + '/' + @Month THEN T0.[Debit] END) - 
            SUM(CASE WHEN CONVERT(VARCHAR(7),T0.RefDate,111) < LTRIM(STR(@Year)) + '/' + @Month THEN T0.[Credit] END) AS Intitial,
        SUM(CASE WHEN convert(varchar(7), T0.RefDate ,111) <= LTRIM(str(@Year)) + '/' + @Month THEN T0.[Debit] END) - 
            SUM(CASE WHEN convert(varchar(7), T0.RefDate ,111) <= LTRIM(str(@Year)) + '/' + @Month THEN T0.[Credit] END) AS Final
FROM    JDT1 T0
        INNER  JOIN OJDT T1 ON T1.[TransId] = T0.[TransId]
        INNER JOIN oact T2 ON T2.[AcctCode] = T0.[Account]
WHERE   t0.RefDate >= @From
GROUP BY T2.[Segment_0] + '-' + T2.[Segment_1] + '-' + T2.[Segment_2],
        T2.[AcctName]
ORDER BY T2.[Segment_0] + '-' + T2.[Segment_1] + '-' + T2.[Segment_2]

如果你使用 CTE 清理它可能更有意义

DECLARE @Year INT
SET @Year = 2016
DECLARE @Month VARCHAR(4)
SET @Month = '07'
DECLARE @YearMonth VARCHAR(7) = LTRIM(STR(@Year)) + '/' + @Month

;WITH cte AS
(
    SELECT  T2.[Segment_0] + '-' + T2.[Segment_1] + '-' + T2.[Segment_2] [Account],
            T2.[AcctName],
            CONVERT(VARCHAR(7),T0.RefDate,111) [RefDate],
            T0.[Debit],
            T0.[Credit]
    FROM    JDT1 T0
            INNER  JOIN OJDT T1 ON T1.[TransId] = T0.[TransId]
            INNER JOIN oact T2 ON T2.[AcctCode] = T0.[Account]
    WHERE   t0.RefDate >= @From
)
SELECT  Account,
        AcctName,
        SUM(CASE WHEN RefDate < @YearMonth THEN [Debit] END) - SUM(CASE WHEN RefDate < @YearMonth THEN [Credit] END) AS Initial,
        SUM(CASE WHEN RefDate <= @YearMonth THEN [Debit] END) - SUM(CASE WHEN RefDate <= @YearMonth THEN [Credit] END) AS Final,
FROM    cte
GROUP BY Account,
        AcctName
ORDER BY Account