Sql 如何通过like表反转组?
您需要引入一个人工表或查看初始表中行数>=max count的\u row\u holder\u表。那就Sql 如何通过like表反转组?,sql,sql-server-2008,Sql,Sql Server 2008,您需要引入一个人工表或查看初始表中行数>=max count的\u row\u holder\u表。那就 Animal Count Color ------ ----- ----- Dog 2 brown Cat 4 black Result Animal Color ------ Dog brown Dog brown Cat black Cat black Cat black Cat blac
Animal Count Color
------ ----- -----
Dog 2 brown
Cat 4 black
Result
Animal Color
------
Dog brown
Dog brown
Cat black
Cat black
Cat black
Cat black
然后,分组表的每一行都由gr.COUNTCUNT行连接,gr.COUNTCUNT行是\u row\u holder\u table表的行
row
-----
1
2
3
...
输出
你可以这样做: 测试数据: 使用递归cte+交叉应用。您可以这样做:
DECLARE @tbl TABLE(Animal varchar(100), Count INT, Color VARCHAR(100))
INSERT INTO @tbl
VALUES
('Dog',2,'brown'),
('Cat',4,'black')
为什么?你不能从原始表格中选择,例如按动物过滤吗?@Luaan No实际上是一张表格。我想如上所示拆分它。很棘手。我很惊讶,如果没有一个可以交叉应用的帮助表,这是不可能的。一个糟糕的解决方案:为什么需要在DB级别上这样做?它在关系查询中没有多大意义。@user2407394请编辑它。感谢you@SubinJacob检查我的答案,这里是sqlfiddle sqlfiddle.com/!6/44c51/1能否简单解释我是否可以使用递归cte?
CREATE TABLE #Test
(
Animal NVARCHAR(20),
CountAnimals INT,
Color NVARCHAR(20)
)
INSERT INTO #Test VALUES ('Dog', 2, 'brown'), ('Cat', 4, 'black');
WITH CTE AS (
SELECT Animal,CountAnimals,Color FROM #Test
UNION ALL
SELECT Animal,CountAnimals-1,Color
FROM CTE
WHERE CountAnimals >= 2
)
SELECT Animal,Color
FROM CTE
ORDER BY Animal DESC
OPTION (MAXRECURSION 0);
DROP TABLE #Test
Animal Color
Dog brown
Dog brown
Cat black
Cat black
Cat black
Cat black
declare @ints table(ID int)
declare @animals table(animal varchar(20),[count] int,color varchar(20))
insert into @animals values ('Dog', 2 ,'brown'),('Cat', 4 ,'black')
declare @int int = 1
declare @maxInt int = (SELECT MAX([count]) from @animals)
while @int <= @maxInt
BEGIN
INSERT INTO
@ints
VALUES
(@int)
SET @int = @int + 1
END
SELECT
animal,
color
FROM
@animals a
INNER JOIN @ints i ON i.ID <=a.[count]
ORDER BY
animal ASC
WITH CTE AS (
SELECT animal,count,color FROM tes
UNION ALL
SELECT animal,count-1,color
FROM CTE
WHERE count > 1
)
SELECT animal,color
FROM CTE
group by animal,color
DECLARE @tbl TABLE(Animal varchar(100), Count INT, Color VARCHAR(100))
INSERT INTO @tbl
VALUES
('Dog',2,'brown'),
('Cat',4,'black')
DECLARE @max INT=(SELECT MAX(Count) FROM @tbl);
;WITH Nbrs ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM Nbrs WHERE n < @max )
SELECT
t.Animal,
t.Count,
t.Color
FROM
@tbl as t
CROSS APPLY
(
SELECT * FROM Nbrs WHERE Nbrs.n<=t.Count
) AS f
ORDER BY t.Animal DESC
Dog 2 brown
Dog 2 brown
Cat 4 black
Cat 4 black
Cat 4 black
Cat 4 black