2014-05-15 86 views
2

我想將前一行的列值存儲在變量中,然後將此變量值與當前行的列進行比較。在MySQL中,例如在sqlfiddle在選擇查詢中使用變量

所以我們來簡單的例子相同的SQL小提琴加載

create table align1 (col1 varchar(100),col2 varchar(100)); 

insert into align1 values ('1','1'); 
insert into align1 values ('1','1'); 
insert into align1 values ('10','1'); 
insert into align1 values ('100','1'); 

我想實現的是如果COL1值相同的前一行和當前行然後增加

查詢:

select col1,col2,if(@temp1=col1,@i:[email protected]+1, @i:=1) as _keycol,@temp1:=col1 from align1,(select @temp1:=null,@i:=0)t 

一切都在mysql的完美。

現在我想在sql server中實現同樣的查詢。

在mysql我已經使用會話變量,所以我不需要聲明,但在SQL服務器中,我需要首先聲明。

我嘗試以下SQL Server 2012中查詢,sqlfiddle

declare @temp1 varchar(1024)='',@i int =0 
select col1,col2,case when @temp1=col1 then @[email protected]+1 else @i=1 end as _keycol,@temp1=col1 from align1; 

我不能執行上面的查詢和它給我的錯誤:

Incorrect syntax near '='. 

然後,我只是想增加數請確保我能夠在選擇查詢中增加可變值.. sqlfiddle

declare @i int =0 
select col1,@[email protected]+1 from align1 

我得到了錯誤:

A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations 

即使我用LAG(),那麼我怎麼可以增加或SELECT語句有條件地復位變量。

所以我想在mysql中得到相同的結果在sql server 2012中。

在此先感謝您。

回答

0

試試這個。它的工作對我來說在SQL Server 2012中的SSMS查詢窗口(這是我第一次在這裏發帖,請原諒我,如果它的格式不正確!)

IF OBJECT_ID('tempdb..#temp') IS NOT NULL 
    DROP TABLE #temp 

create table align1 (col1 varchar(100),col2 varchar(100)); 

insert into align1 values ('1','1'); 
insert into align1 values ('1','1'); 
insert into align1 values ('10','1'); 
insert into align1 values ('100','1'); 
insert into align1 values ('100','1'); 
insert into align1 values ('300','1'); 
insert into align1 values ('500','1'); 
insert into align1 values ('500','1'); 

DECLARE @count INT = 0; 
DECLARE @prev VARCHAR(100); 
DECLARE @current VARCHAR(100); 
DECLARE @i INT = 0; 

SELECT @count = count(*) from align1 

SELECT * INTO #temp FROM align1 
SET @current = (SELECT TOP 1 col1 FROM #temp) 
DELETE TOP (1) FROM #temp 

WHILE @Count > 0 
BEGIN 
SET @prev = @current; 
SET @current = (SELECT TOP 1 col1 From #temp) 
IF @current = @prev 
    BEGIN 
    SET @i = @i + 1; 
    END 
DELETE TOP (1) FROM #temp; 
SET @Count = @Count - 1; 
END 

PRINT '@i = ' + CONVERT(VARCHAR,@i) 

結果:

@i = 3