当前位置: 首页 > 面试题库 >

如何在SQL Server中获取列明智的数据?

松霖
2023-03-14
问题内容

如何在SQL Server中获取列明智的数据?

格式:

Name    Date
----    -----
xxx     10/15/2015
xxx     12/15/2015
xxx     15/15/2015
yyy     20/15/2015
yyy     25/15/2015

所需的输出:

Name   Date         Date         Date
--------------------------------------------
xxx    10/15/2015   12/15/2015   15/15/2015
yyy    20/15/2015   25/15/2015

问题答案:

例如,您可以使用以下代码来透视数据:

在MySQL上:

SELECT data.name, 
    if(data.row_number=1,date,null) as date1,
    if(data.row_number=2,date,null) as date2,
    if(data.row_number=3,date,null) as date3,
    if(data.row_number=4,date,null) as date4,
    if(data.row_number=5,date,null) as date5
FROM (
    SELECT @row_number:=@row_number+1 AS row_number, name, date 
    FROM yourTable, (SELECT @row_number:=0) AS t
    ORDER BY date 
    ) as data
GROUP BY data.name;

在SQL Server上:

-- Generate demo data
CREATE TABLE #yourTable(name nvarchar(20), date date)
INSERT INTO #yourTable(name,date)
VALUES(N'xxx',GETDATE()), (N'xxx', DATEADD(day,-1,GETDATE())), (N'yyy',GETDATE()), (N'yyy', DATEADD(day,1,GETDATE()))

-- this is your part
SELECT pvt.*
FROM (
    SELECT ROW_NUMBER() OVER(PARTITION BY name ORDER BY date) as rn, name, date
    FROM #yourTable
) as data
PIVOT(
    MIN(date)
    FOR rn IN([1],[2],[3],[4],[5],[6])
) as pvt

-- cleanup
DROP TABLE #yourTable

如果您的日期列表会增加,这将是一个动态的枢轴,它将适应:

-- Generate demo data
CREATE TABLE #yourTable(name nvarchar(20), date date)
INSERT INTO #yourTable(name,date)
VALUES(N'xxx',GETDATE()), (N'xxx',DATEADD(day,1,GETDATE())), (N'xxx', DATEADD(day,-1,GETDATE())), (N'yyy',GETDATE()), (N'yyy', DATEADD(day,1,GETDATE()))

DECLARE @sql nvarchar(max), @columnlist nvarchar(max)

SELECT @columnlist = 
        COALESCE(@columnlist + N',['+CONVERT(nvarchar(max),ROW_NUMBER() OVER(ORDER BY date))+']', 
            N'['+CONVERT(nvarchar(max),ROW_NUMBER() OVER(ORDER BY date))+']'
        )
FROM #yourTable
WHERE name = (
    SELECT TOP (1) name
    FROM #yourTable
    GROUP BY name
    ORDER BY COUNT(*) DESC
)
SELECT @columnlist

-- this is your part
SET @sql = N'
SELECT pvt.*
FROM (
    SELECT ROW_NUMBER() OVER(PARTITION BY name ORDER BY date) as rn, name, date
    FROM #yourTable
) as data
PIVOT(
    MIN(date)
    FOR rn IN('+@columnlist+')
) as pvt'
EXEC(@sql)

-- cleanup
DROP TABLE #yourTable


 类似资料:
  • 问题内容: 如何在存储过程中获取特定数据库的数据库名称。 问题答案: 要获取当前的数据库名称,请使用。 DB_NAME(Transact-SQL)

  • 问题内容: 如标题中所指定,我想在sqlserver中获取数据库名称,我所知道的所有信息都是数据源名称,用于获取Connection对象的登录名/密码,请在Java中显示一些有关如何正确检索数据库名称的指针,谢谢! 甚至 问题答案: 从连接对象获取一个实例。 数据库名称可以通过或方法获得(取决于JDBC驱动程序的供应商)。 或使用或方法。 如果您有兴趣获得Oracle数据库服务器或Oracle数据

  • 问题内容: 之间有什么区别: 和 如何通过column-indexnumber获取数据?而不是通过索引字符串? 问题答案: 一个是列(又名系列),而另一个是DataFrame: 列“ b”(又名系列): [1]中具有列(位置)的子数据框: 注意:最好(而不是模棱两可)指定您是在谈论列名,例如[‘b’]还是整数位置,因为有时您可以将列命名为整数:

  • 问题内容: 我从CSV文件加载了一些机器学习数据。前两列是观察值,其余两列是要素。 目前,我执行以下操作: 它给出了类似的东西: 我想两个dataframes切片此数据框:包含列一个和和包含一个列,和。 不可能写这样的东西 我不确定最好的方法是什么。我需要吗? 顺便说一下,我发现数据帧索引非常不一致:允许,但不允许。另一方面,不允许,但允许。是否有实际原因?如果列是由Int索引的,这确实令人困惑,

  • 我能够成功地从服务器获取JSON数据,但无法解码数据并配置到所需的列表。我该怎么做? 这是我用来获取字段数据的代码 json['content']是一个映射 下面是我正在使用的JSON数据结构 上面的JSON数据结构在每个项目细节中都嵌套了order no,它必须在所有订单号中提取,然后是订单的相应数据。

  • 我们正试图在spark中生成数据集的逐列统计数据。除了使用统计库中的summary函数之外。我们使用以下程序: > 我们确定具有字符串值的列 为整个数据集生成键值对,使用列号作为键,使用列的值作为值 生成新的格式映射 (K,V)- 然后我们使用reduceByKey来找到所有列中所有唯一值的总和。我们缓存这个输出以减少进一步的计算时间。 在下一步中,我们使用for循环遍历列,以查找所有列的统计信息