2010-04-16 57 views
1

。 只有两个值的“X”和“Y”。所以表看起来像吨-SQL查询分组

Name  OnGoing 
---------------- 
A  X 
A  X 
A  X 
B  Y 
B  Y 
C  X 
C  X 
C  X 

如何编写这样的查询,可以交替每组名称的值。

回答

5

如何像

DECLARE @Table TABLE(
     Name VARCHAR(10) 
) 

INSERT INTO @Table SELECT 'A' 
INSERT INTO @Table SELECT 'A' 
INSERT INTO @Table SELECT 'A' 
INSERT INTO @Table SELECT 'B' 
INSERT INTO @Table SELECT 'B' 
INSERT INTO @Table SELECT 'C' 
INSERT INTO @Table SELECT 'C' 
INSERT INTO @Table SELECT 'C' 

SELECT *, 
     CASE 
      WHEN RowNum % 2 = 0 
       THEN 'Y' 
      ELSE 'X' 
     END 
FROM @Table t INNER JOIN 
     (
      SELECT Name, 
        ROW_NUMBER() OVER (ORDER BY Name) RowNum 
      FROM @Table 
      GROUP BY Name 
     ) sub ON t.Name = sub.Name 
2

改变你的表以包括新列:

ALTER TABLE YourTable ADD 
    OnGoing char(1) NULL 
GO 

,然后试试这个:

DECLARE @YourTable table (Name char(1), OnGoing char(1)) 
INSERT @YourTable Values ('A',NULL) 
INSERT @YourTable Values ('A',NULL) 
INSERT @YourTable Values ('A',NULL) 
INSERT @YourTable Values ('B',NULL) 
INSERT @YourTable Values ('B',NULL) 
INSERT @YourTable Values ('C',NULL) 
INSERT @YourTable Values ('C',NULL) 
INSERT @YourTable Values ('C',NULL) 


;WITH TableRows AS 
(
SELECT 
    *, ROW_NUMBER() OVER(ORDER BY Name) AS RowID 
    FROM (SELECT DISTINCT 
       * 
       FROM @YourTable 
     ) dt 
) 
UPDATE y 
    SET OnGoing=CASE 
        WHEN r.RowID % 2 = 1 THEN 'X' 
        ELSE 'Y' 
       END 
    FROM @YourTable   y 
     INNER JOIN TableRows r ON y.Name=r.Name 

SELECT * FROM @YourTable 

OUTPUT:

Name OnGoing 
---- ------- 
A X 
A X 
A X 
B Y 
B Y 
C X 
C X 
C X 

(8 row(s) affected) 
+0

+1这显然是最好的答案,因为你实际更新原来的表作为要求,因为CTE是最热门的事情。 – 2010-04-16 18:31:44

+0

我同意这更接近我所需要的。但是,由于核心逻辑是相同的,我答复了最早的答复..现在它的一个投票从我..非常感谢KM。 – stackoverflowuser 2010-04-16 18:48:43

+0

如果只有我没有5分钟的分心,放慢了我的回复!...; -o – 2010-04-16 19:38:33

0

这将这样的伎俩:

select 
    t1.Name, 
    sub1.OnGoing 
from 
    TableOne t1 
    INNER JOIN 
(select 
    Name, 
    CASE RANK() over (order by Name) % 2 
    WHEN 0 THEN 'Y' 
    WHEN 1 THEN 'X' 
    END as OnGoing 
from 
    TableOne 
group by Name) sub1 ON sub1.Name = t1.Name 

这是我测试的实际输出:

Name OnGoing 
---- ------- 
A X 
A X 
A X 
B Y 
B Y 
C X 
C X 
C X