sql server 2008上的值比较

时间:2014-02-24 11:07:25

标签: sql-server tsql

有一个包含5列的表格:

COL1,COL2,COL3,COL4,MONTHNAME

类似的东西:

col1  | col2 | col3 | col4 | monthName
----------------------------------------
4     | 5    | 55   | 8    | January
4     | 4    | 33   | 6    | February

col1和col2 sum必须与上个月的col4相同。所以我可以比较

select * from table1 where col1+col2=col4 where monthName='February'

但它会比较我想要的所有行,例如

select * 
from table1 
where col1+col2 = (select col4 from table1 where monthName='January') 
where monthName='February'

我是如何以正确的方式做到这一点的?

嗯,这是关于月度报告的事情。

也许我的主要问题是从过去一个月(例如1月)获得col4。

我想更清楚地解释一下:

  1. 获取当月的 col1 col2 (位于monthName列中)并执行总和。
  2. 获取上个月的 col4单元格值。在这种情况下,它是二月的 monthName 列。
  3. col1 + col2 (当前月份)与 col4 (上个月 monthName )进行比较。
  4. 在我的第一个例子中,第2行是真的,因为4 + 4 = 8,它与1月的 col4值(8)相匹配。如果当前月份的col1和col2总和与上个月的col4数据匹配,那么用户就是好的。
  5. 我很容易得到col1和col2:
        选择sum(col1 + col2)作为table1中的currentTotal,其中monthName ='February'

    但我如何从上个月获得col4值并将其存储在某处然后与currentTotal进行比较?每个月都会插入15行,并将与上个月进行比较。

    不确定这次我是否解释得更好!

2 个答案:

答案 0 :(得分:1)

月份命名可疑,但根据我们掌握的信息,以下内容应该可以解决问题:

-- Creating a table variable as a sample for your query.
DECLARE @T TABLE (col1 INT, col2 INT, col3 INT, col4 INT, monthName VARCHAR(25))
INSERT INTO @T VALUES (4,4,55,9,'January'),(5,4,3,6,'February'), (3,3,3,6,'March')

-- Update the references to your actual table in this query.
;WITH CTE AS (SELECT *
    , DATEPART(MM,monthName+' 01 2014') Mnum
    FROM @T)
SELECT CA.*
FROM CTE C
CROSS APPLY 
    (SELECT col1, col2, col3, col4, monthName 
    FROM CTE B
    WHERE B.Mnum-1 = C.Mnum AND (B.col1+B.col2 = C.col4)) CA
ORDER BY Mnum

它的作用是,它为月份名指定一个数字,然后按月份号的顺序使用该集合,而CROSS APPLY仅选择col1和2之和的行等于上个月数的col4。< / p>

答案 1 :(得分:0)

您可以尝试下面的伪代码

select * 
from table1 t1
join
(
select monthName, SUM(col1+col2-col4) as isZero
group by monthName
) as t2
on t2.monthName = t1.monthName
where t2.isZero != 0