2014-02-24 38 views
1

有5列的表格:值比較2008

COL1,COL2,COL3,COL4,MONTHNAME

喜歡的東西:

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

col1和COL2之和必須與上個月的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' 

我如何以正確的方式做到這一點?

那麼,這是關於月度報告。

也許我的主要問題是從過去一個月(例如一月)獲取col4。

我想更清楚地解釋:

  1. 獲取COL1當前月份(這是在MONTHNAME列)COL2做的總和。
  2. 從上個月獲取col4單元格值。在這種情況下,是monthName 2月的欄。
  3. COL1 COL2 +(本月)進行比較,以COL4(上個月在MONTHNAME)。
  4. 在我的第一個例子中,行號2是真的,因爲4 + 4 = 8這與1月col4值(8)相匹配。如果當前月份的col1和col2總和與上個月的col4數據匹配,那麼用戶是好的。

我能得到col1和col2上很容易:
選擇總和(COL1 + COL2)作爲currentTotal從表1,其中MONTHNAME =「二月」

但我如何從上個月商店COL4值它在什麼地方然後比較currentTotal?每個月都會插入15行,並與上個月進行比較。

不知道這次我是否更好解釋一下!

+1

你應該重新考慮你的設計。而不是'monthName varchar',你應該考慮'first_of_month date'。 – gvee

+0

爲什麼不只是計算SUM(col1 + col2-col4)GROUP BY月?這種方式與零病不同是一個無效值 – jean

+0

你可以添加更多的數據行到table1和預期的結果?我不明白你的解釋 –

回答

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 
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的行。

+0

+1雖然你應該加入而不是使用交叉申請(據我所知) –