大牛们sql把行转列,把空缺的月份补充进去

work_fei 2017-02-14 02:27:46




把上图数据转换成下图的数据

CREATE TABLE [test] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[MenuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[score] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[dates] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO


insert into test values('a','20','2016-12')
insert into test values('b','20','2016-12')
insert into test values('a','20','2017-01')
insert into test values('b','20','2017-01')
insert into test values('c','20','2017-01')
insert into test values('c','20','2017-02')

测试数据
...全文
333 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2017-02-14
  • 打赏
  • 举报
回复
查找错误数据
SELECT *
FROM test
WHERE ISDATE(dates+'-01') = 0
work_fei 2017-02-14
  • 打赏
  • 举报
回复
引用 10 楼 roy_88 的回复:
[quote=引用 9 楼 work_fei 的回复:] 还是有点小问题:从字符串转换为 datetime 时发生语法错误。
检查你的数据格式是否规范 如格式:XXXX-XX[/quote] 还是只有menuname这一列
中国风 2017-02-14
  • 打赏
  • 举报
回复
引用 9 楼 work_fei 的回复:
还是有点小问题:从字符串转换为 datetime 时发生语法错误。
检查你的数据格式是否规范 如格式:XXXX-XX
work_fei 2017-02-14
  • 打赏
  • 举报
回复
引用 8 楼 roy_88 的回复:
以上日期列生成是取表test.dates最小和最大 如需把日期作为条件,在生成条件和拼凑语句里同时加条件
还是有点小问题:从字符串转换为 datetime 时发生语法错误。
中国风 2017-02-14
  • 打赏
  • 举报
回复
以上日期列生成是取表test.dates最小和最大 如需把日期作为条件,在生成条件和拼凑语句里同时加条件
中国风 2017-02-14
  • 打赏
  • 举报
回复
日期不连续时这样用
--动态写法
GO
DECLARE @Sql NVARCHAR(max)=''
SELECT @Sql=@Sql+',MAX(CASE WHEN [dates]='''+dates+''' THEN score END) AS '+QUOTENAME(dates) FROM (SELECT CONVERT(VARCHAR(7),DATEADD(mm,b.number,a.d1+'-01'),120) FROM (SELECT MIN(dates) AS d1,MAX(dates) AS d2 FROM test) AS a,master.dbo.spt_values AS b WHERE b.type='P' AND DATEADD(mm,b.number,a.d1+'-01')<=a.d2+'-01') AS a([dates]) 
EXEC('SELECT [MenuName]'+@Sql+' FROM test GROUP BY [MenuName]')

/*
MenuName	2016-12	2017-01	2017-02
a	20	20	NULL
b	20	20	NULL
c	NULL	20	20
*/
work_fei 2017-02-14
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
[quote=引用 4 楼 work_fei 的回复:] 大牛你好,日期是不固定的,你动态写法只得出了menuname
动态写法结果都是相同的,只得出menuname? 有一种情况就是某一个月没数据才会存在没有这个日期列,这样的情况需要先动态生成列 [/quote] 怎样动态生成列呢?请大牛赐教
中国风 2017-02-14
  • 打赏
  • 举报
回复
引用 4 楼 work_fei 的回复:
大牛你好,日期是不固定的,你动态写法只得出了menuname
动态写法结果都是相同的,只得出menuname? 有一种情况就是某一个月没数据才会存在没有这个日期列,这样的情况需要先动态生成列
work_fei 2017-02-14
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
e.g.
USE tempdb
GO
CREATE TABLE [test] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[MenuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[score] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[dates] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO


insert into test values('a','20','2016-12')
insert into test values('b','20','2016-12')
insert into test values('a','20','2017-01')
insert into test values('b','20','2017-01')
insert into test values('c','20','2017-01')
insert into test values('c','20','2017-02')
GO
SELECT [MenuName]
	,MAX(CASE WHEN [dates]='2016-12' THEN score END) AS [2016-12]
	,MAX(CASE WHEN [dates]='2017-01' THEN score END) AS [2017-01]
	,MAX(CASE WHEN [dates]='2017-02' THEN score END) AS [2017-02]
FROM test 
GROUP BY [MenuName] 
/*
MenuName	2016-12	2017-01	2017-02
a	20	20	NULL
b	20	20	NULL
c	NULL	20	20
*/
GO
--动态写法
DECLARE @Sql NVARCHAR(max)=''
SELECT @Sql=@Sql+',MAX(CASE WHEN [dates]='''+dates+''' THEN score END) AS '+QUOTENAME(dates) FROM test GROUP BY [dates]
EXEC('SELECT [MenuName]'+@Sql+' FROM test GROUP BY [MenuName]')
大牛你好,日期是不固定的,你动态写法只得出了menuname
二月十六 2017-02-14
  • 打赏
  • 举报
回复
行列转换问题,网上搜搜很多教程。
二月十六 2017-02-14
  • 打赏
  • 举报
回复
语句:
SELECT  MenuName ,
MAX(CASE WHEN dates = '2016-12' THEN score
ELSE 0
END) AS '2016-12' ,
MAX(CASE WHEN dates = '2017-01' THEN score
ELSE 0
END) AS '2017-01' ,
MAX(CASE WHEN dates = '2017-02' THEN score
ELSE 0
END) AS '2017-02'
FROM dbo.test
GROUP BY MenuName


结果:
中国风 2017-02-14
  • 打赏
  • 举报
回复
e.g.
USE tempdb
GO
CREATE TABLE [test] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[MenuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[score] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[dates] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO


insert into test values('a','20','2016-12')
insert into test values('b','20','2016-12')
insert into test values('a','20','2017-01')
insert into test values('b','20','2017-01')
insert into test values('c','20','2017-01')
insert into test values('c','20','2017-02')
GO
SELECT [MenuName]
	,MAX(CASE WHEN [dates]='2016-12' THEN score END) AS [2016-12]
	,MAX(CASE WHEN [dates]='2017-01' THEN score END) AS [2017-01]
	,MAX(CASE WHEN [dates]='2017-02' THEN score END) AS [2017-02]
FROM test 
GROUP BY [MenuName] 
/*
MenuName	2016-12	2017-01	2017-02
a	20	20	NULL
b	20	20	NULL
c	NULL	20	20
*/
GO
--动态写法
DECLARE @Sql NVARCHAR(max)=''
SELECT @Sql=@Sql+',MAX(CASE WHEN [dates]='''+dates+''' THEN score END) AS '+QUOTENAME(dates) FROM test GROUP BY [dates]
EXEC('SELECT [MenuName]'+@Sql+' FROM test GROUP BY [MenuName]')
下载代码方式:https://pan.quark.cn/s/dd3561eca308 在软件开发领域,面向对象编程(OOP)是一种普遍采纳的结构化方法,它使得开发者能够借助模拟现实环境中的实体和关系来构建软件系统。在本案例中,我们观察到的是一个关于借助抽象类来执行不同几何图形面积求解的实践应用。现在,让我们详细分析这一议题。 标题 "应用抽象类计算面积" 清晰地表明我们将要讨论一个抽象类,此类设定了一个用于测量图形面积的标准函数,但并未提供实际的执行过程。抽象类在诸如C#或Java等编程语言中通常借助`abstract`修饰符进行声明,它们无法直接创建对象实例,仅能作为其他类的基础模板。 描述部分提及的"图形界面应用"暗示这是一个基于视觉用户界面(GUI)的系统,可能运用了.NET Framework的Windows Forms或WPF技术,或者是Java平台的Swing或JavaFX框架。在这样环境下,用户能够通过视觉元素与这些几何体进行互动,例如输入相关尺寸并观看到计算得出的面积值。 抽象类“几何体”内嵌了“计算面积”这一抽象函数。在代码层面,这可以被表述为: ```csharp public abstract class GeometricShape { public abstract double CalculateArea(); } ``` 随后,有三个派生类:圆(Circle)、矩形(Rectangle)和三角形(Triangle),它们各自提供了这个抽象函数的具体实现。比如,圆的面积是通过π乘以半径的平方得到的,矩形的面积是长和宽的乘积,而三角形的面积可能是底乘以高再除以2的结果。这些类将提供具体实现来计算它们各自的面积: ```csharp p...
内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工作模式下的运行机理与性能表现,重点探讨了软开关实现、高效率能量转换及宽范围电压调节等关键技术优势。通过Simulink搭建精确的仿真模型,对谐振腔参数、开关频率、电压增益、系统效率等关键指标进行仿真分析,验证了理论设计的正确性。同时,详细研究了移相控制策略对系统动态响应、稳定性和轻载/重载工况适应性的影响,揭示了控制参数与电路参数之间的耦合关系,为高频高效电源设计提供了理论依据和实践指导。; 适合人群:具备电力电子技术、模拟电路及自动控制理论基础,从事开关电源、新能源变换器、电动汽车充电模块或高频电源系统研发的工程师及高校研究生。; 使用场景及目标:①掌握全桥LLC谐振变换器的拓扑结构、工作原理与关键参数设计方法;②理解移相控制在实现零电压开通(ZVS)和零电流关断(ZCS)中的作用机制;③通过Simulink仿真掌握变换器建模、参数优化与性能评估流程,服务于实际产品开发与学术课题研究。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作,重点关注谐振网络(Lr, Lm, Cr)参数与移相角之间的匹配设计,深入理解软开关条件的形成过程,并通过调整负载和输入电压进行多工况仿真,以全面掌握系统动态特性。

22,296

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧