Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 将行拆分为12列_Sql_Pivot - Fatal编程技术网

Sql 将行拆分为12列

Sql 将行拆分为12列,sql,pivot,Sql,Pivot,我有一张大概有1000行的桌子。其中一列是URL 所以,从表中选择URL 但是,我希望每行显示12个URL。原因是我们正在为人们在线发布工作,他们将一次浏览12个网站 因此,在本例中,我们将有大约90行被输出,每行有12列,除了最后一行短几列之外 有没有一种简单的方法可以做到这一点?这是pivot还是其他功能的情况 带有动态枢轴的简单示例 CREATE TABLE dbo.Url ( Id int IDENTITY, url nvarchar(max) ) INSERT

我有一张大概有1000行的桌子。其中一列是URL

所以,从表中选择URL

但是,我希望每行显示12个URL。原因是我们正在为人们在线发布工作,他们将一次浏览12个网站

因此,在本例中,我们将有大约90行被输出,每行有12列,除了最后一行短几列之外


有没有一种简单的方法可以做到这一点?这是pivot还是其他功能的情况

带有动态枢轴的简单示例

CREATE TABLE dbo.Url
 (
  Id int IDENTITY,
  url nvarchar(max)
  )    

INSERT dbo.Url
VALUES ('http://www.url1.com'),
       ('http://www.url2.com'),
       ('http://www.url3.com'),
       ('http://www.url4.com')

DECLARE @cols AS nvarchar(MAX),
        @query AS nvarchar(MAX)

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(ROW_NUMBER() OVER (ORDER BY Url))
                      FROM dbo.url
                      GROUP BY Url
                      FOR XML PATH(''), TYPE
                      ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = 'SELECT' + @cols + ' FROM
      (
       SELECT Id, url
       FROM dbo.url
       ) x
       PIVOT
       (
        MAX(url)
        FOR Id IN (' + @cols + ') 
        ) p '
EXECUTE(@query)

这是在线解决方案。不过,这看起来可能有点复杂

declare @Temp_URLS table (URL nvarchar(128))
declare @Temp_Reviewers table (Name nvarchar(128))

insert into @Temp_Reviewers (Name)
select top 5
    'Reviewer' + 
    right('0000' + 
cast(row_number() over (order by number) as nvarchar(128)), 4)  
from master.dbo.spt_values

insert into @Temp_URLS (URL)
select top 30 
    'http://URL' + 
    right('0000' + 
    cast(row_number() over (order by number) as nvarchar(128)), 4) + '.com'
from master.dbo.spt_values

select
    Name,
    [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]
from 
(
    select TT.Name, row_number() over (order by TT.Name asc) as RowNum
    from @Temp_Reviewers as TT
) as R
    outer apply
    (
        select top 12 TT.URL, row_number() over (order by TT.URL) as RowNum
    from 
    (
        select TTT.URL, 1 + row_number() over (order by TTT.URL asc) / 12 as RowNum
    from @Temp_URLS as TTT
    ) as TT
        where TT.RowNum = R.RowNum
    ) as CALC
pivot
(
    min(CALC.URL)
    for CALC.RowNum in
        ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
) as PVT
这是一个没有枢轴和行号的解决方案

declare @Temp_URLS table (URL nvarchar(128), csikey int identity(1, 1))

insert into @Temp_URLS (URL)
select top 30 
    'http://URL' + 
    right('0000' + 
    cast(row_number() over (order by number) as nvarchar(128)), 4) + '.com'
from master.dbo.spt_values

select
    A.RowNum1,
    min(case when A.RowNum2 = 1 then A.URL else null end) as [1],
    min(case when A.RowNum2 = 2 then A.URL else null end) as [2],
    min(case when A.RowNum2 = 3 then A.URL else null end) as [3],
    min(case when A.RowNum2 = 4 then A.URL else null end) as [4],
    min(case when A.RowNum2 = 5 then A.URL else null end) as [5],
    min(case when A.RowNum2 = 6 then A.URL else null end) as [6],
    min(case when A.RowNum2 = 7 then A.URL else null end) as [7],
    min(case when A.RowNum2 = 8 then A.URL else null end) as [8],
    min(case when A.RowNum2 = 9 then A.URL else null end) as [9],
    min(case when A.RowNum2 = 10 then A.URL else null end) as [10],
    min(case when A.RowNum2 = 11 then A.URL else null end) as [11],
    min(case when A.RowNum2 = 12 then A.URL else null end) as [12]
from
(
    select
        T1.csikey, T1.URL,
        count(T2.csikey) / 12 + 1 as RowNum1,
        count(T2.csikey) % 12 + 1 as RowNum2
    from @Temp_URLS as T1
        left outer join @Temp_URLS as T2 on T2.csikey < T1.csikey
group by T1.csikey, T1.URL
) as A
group by A.RowNum1

请尝试以下查询,它在Oracle 11G中工作:

SELECT * FROM(
  SELECT URL,
    CAST(FLOOR((NUM+2)/3) AS INT) AS Row_Num,
    MOD(NUM+2, 3)+1 AS OrderNum
  FROM(
      SELECT 
        ROW_NUMBER() OVER (ORDER BY URL) as NUM, URL
      FROM 
        TBL_URL
  )T1
)T2 PIVOT (MIN(URL) FOR OrderNum IN ('1' AS "1", '2' AS "2", '3' AS "3"));

对于从行中提取12个URL作为列,有什么标准吗?您可以使用LIMIT进行分页,但真正的解决方案不是在SQL查询中这样做,而是在软件的表示层中这样做。您使用的是什么RDBMS?SQL Server、mysql、oracle?谢谢Alexander,但我得到:Msg 1056,级别15,状态1,第1行选择列表中的元素数超过了允许的最大4096个元素数。Msg 102,15级,状态1,第5行“x”附近的语法不正确。你需要阅读以下文章:接受答案是如何工作的?只是一张便条。实际上,我们将所有必要的数据存储在一个表中。它有一列csikey,它是唯一的ID,但不是数字,还有一列b url。上面的查询是否可以轻松修改为只引用一个表?我也很乐意通过paypal为您提供一些帮助:我添加了一个没有rownumber和pivot的解决方案。不幸的是,我与甲骨文的关系不大