Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何通过like表反转组?_Sql_Sql Server 2008 - Fatal编程技术网

Sql 如何通过like表反转组?

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

您需要引入一个人工表或查看初始表中行数>=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     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