需要来自同一查询的两个不同结果
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 THAN
和 LESS 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
我正在检查一个月的初始余额和最终余额,我想出了一个查询来获取其中一个,但我需要在同一个查询中显示两个结果。我无法执行子查询,因为我在查询中使用了 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 THAN
和 LESS 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