。 只有两个值的“X”和“Y”。所以表看起来像吨-SQL查询分组
Name OnGoing
----------------
A X
A X
A X
B Y
B Y
C X
C X
C X
如何编写这样的查询,可以交替每组名称的值。
。 只有两个值的“X”和“Y”。所以表看起来像吨-SQL查询分组
Name OnGoing
----------------
A X
A X
A X
B Y
B Y
C X
C X
C X
如何编写这样的查询,可以交替每组名称的值。
如何像
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
改变你的表以包括新列:
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)
这将这样的伎俩:
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
+1这显然是最好的答案,因为你实际更新原来的表作为要求,因为CTE是最热门的事情。 – 2010-04-16 18:31:44
我同意这更接近我所需要的。但是,由于核心逻辑是相同的,我答复了最早的答复..现在它的一个投票从我..非常感谢KM。 – stackoverflowuser 2010-04-16 18:48:43
如果只有我没有5分钟的分心,放慢了我的回复!...; -o – 2010-04-16 19:38:33