Sql server t-sql分组查询
根据下表Sql server t-sql分组查询,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,根据下表 Name --------- A A A B B C C C 我想在这个表中添加另一个名为“持续”的列,每个名称组的值应该是交替的。 只有两个值“X”和“Y”。所以这张桌子看起来像 Name OnGoing ---------------- A X A X A X B Y B Y C X C X C X 如何编写这样一个查询,可以为每组名称替换值。类似这样的查
Name
---------
A
A
A
B
B
C
C
C
我想在这个表中添加另一个名为“持续”的列,每个名称组的值应该是交替的。
只有两个值“X”和“Y”。所以这张桌子看起来像
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
像这样的怎么样
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
输出:
Name OnGoing
---- -------
A X
A X
A X
B Y
B Y
C X
C X
C X
(8 row(s) affected)
更改表格以包含新列:
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
输出:
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
这将实现以下目的:
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是最热门的。我同意这更接近我需要的。但由于核心逻辑是相同的,我同意最早的回答。。现在,我投了赞成票。。非常感谢。如果我没有5分钟的分心,那我的回答就慢了-o+1这显然是最好的答案,因为您实际上是按照要求更新原始表,而且CTE是最热门的东西。我同意这更接近我所需要的。但由于核心逻辑是相同的,我同意最早的回答。。现在,我投了赞成票。。非常感谢。如果我没有5分钟的分心,那我的回答就慢了-o