这样的SQL语句该怎么写?求符合要求的字段数量或字段名

蜗牛学编程 2020-08-08 12:13:31
大佬们,请教一下。
现在有这么一个情况,我要统计销量达标(字段为‘Y’)的人数或具体人名,用SQL该这么写?
如果是多行一列,很好写。但如果把人名字段,就不知道该这么弄了。
求老师们指点。

注:
我是要捞出这些人名放入到checklisbot或listbox中。

...全文
3931 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
丁劲犇 2020-08-09
  • 打赏
  • 举报
回复
引用 10 楼 蜗牛学编程 的回复:
[quote=引用 9 楼 丁劲犇 的回复:]人名和达标类似学生和成绩,应该是学生-成绩都是列名,然后每行只记录一个人的某一门成绩。当时见过大公司的绩效系统是这样设计的。
https://blog.csdn.net/liuchaoxuan/article/details/80560739

仔细看了一下,貌似不合适,它那个是针对少数的几门课程好用。但如果课程几十上百门,就非常麻烦了。[/quote]

上百门确实很多。不过,如果把人当作课程,课程当作人,能稍微降低点难度。按照这个设计,人和课程其实是等价的。
蜗牛学编程 2020-08-09
  • 打赏
  • 举报
回复
引用 9 楼 丁劲犇 的回复:
人名和达标类似学生和成绩,应该是学生-成绩都是列名,然后每行只记录一个人的某一门成绩。当时见过大公司的绩效系统是这样设计的。 https://blog.csdn.net/liuchaoxuan/article/details/80560739
仔细看了一下,貌似不合适,它那个是针对少数的几门课程好用。但如果课程几十上百门,就非常麻烦了。
丁劲犇 2020-08-09
  • 打赏
  • 举报
回复
人名和达标类似学生和成绩,应该是学生-成绩都是列名,然后每行只记录一个人的某一门成绩。当时见过大公司的绩效系统是这样设计的。
https://blog.csdn.net/liuchaoxuan/article/details/80560739
八爻老骥 2020-08-08
  • 打赏
  • 举报
回复
子查询做透视?
Bridge_go 2020-08-08
  • 打赏
  • 举报
回复
行列转换...?
蜗牛学编程 2020-08-08
  • 打赏
  • 举报
回复
引用 4 楼 吉普赛的歌 的回复:
多行多列也就那样, 不麻烦。 下面是多行多列的,你类似下面做就好了。
use tempdb
go
if OBJECT_ID('t') is not null
drop table t
go
create table t(
	姓名 nvarchar(10),
	张三 nvarchar(10),
	李四 nvarchar(10),
	王五 nvarchar(10),
	陈九 nvarchar(10),
	赵七 nvarchar(10),
	孙六 nvarchar(10)
)
go
insert into t values('销量达标','N','N','Y','Y','Y','Y');
insert into t values('质量达标','Y','N','N','N','N','N');

select * from t 
/*
姓名	张三	李四	王五	陈九	赵七	孙六
销量达标	N	N	Y	Y	Y	Y
质量达标	Y	N	N	N	N	N
*/
go
select * from t unpivot ( [达标] for [姓名2] IN ([张三],[李四],[王五],[陈九],[赵七],[孙六])) up
/*
姓名	达标	姓名2
销量达标	N	张三
销量达标	N	李四
销量达标	Y	王五
销量达标	Y	陈九
销量达标	Y	赵七
销量达标	Y	孙六
质量达标	Y	张三
质量达标	N	李四
质量达标	N	王五
质量达标	N	陈九
质量达标	N	赵七
质量达标	N	孙六
*/
go

select * from (
select * from t unpivot ( [达标] for [姓名2] IN ([张三],[李四],[王五],[陈九],[赵七],[孙六])) up
) as tt
where tt.姓名='销量达标' and 达标='Y'
/*
姓名	达标	姓名2
销量达标	Y	王五
销量达标	Y	陈九
销量达标	Y	赵七
销量达标	Y	孙六
*/
啊,那么多语句呢。 我还以为就 一条SQL语句可以完成这转变。 因为我这只是一个例子,实际上我们可能有几十个人,如果用这种逐一列举的方式好像复杂。而且后面再加人也很麻烦。 还有其他的办法?
蜗牛学编程 2020-08-08
  • 打赏
  • 举报
回复
引用 6 楼 丁劲犇 的回复:
这数据库设计的有问题,应该每个人一行。这样干,公司人员调整就要动表结构的。
因为这个货物品种后面有两百多种,人的话分两类,每类大概三十多人,所以人名当列更合适些。人员调整的话在datagridview里直接屏蔽这一列就可以了
丁劲犇 2020-08-08
  • 打赏
  • 举报
回复
这数据库设计的有问题,应该每个人一行。这样干,公司人员调整就要动表结构的。
小白卟白 2020-08-08
  • 打赏
  • 举报
回复
有动态行转列的实力可以看一下: https://download.csdn.net/download/weixin_43941291/12643063
吉普赛的歌 2020-08-08
  • 打赏
  • 举报
回复
多行多列也就那样, 不麻烦。 下面是多行多列的,你类似下面做就好了。
use tempdb
go
if OBJECT_ID('t') is not null
drop table t
go
create table t(
	姓名 nvarchar(10),
	张三 nvarchar(10),
	李四 nvarchar(10),
	王五 nvarchar(10),
	陈九 nvarchar(10),
	赵七 nvarchar(10),
	孙六 nvarchar(10)
)
go
insert into t values('销量达标','N','N','Y','Y','Y','Y');
insert into t values('质量达标','Y','N','N','N','N','N');

select * from t 
/*
姓名	张三	李四	王五	陈九	赵七	孙六
销量达标	N	N	Y	Y	Y	Y
质量达标	Y	N	N	N	N	N
*/
go
select * from t unpivot ( [达标] for [姓名2] IN ([张三],[李四],[王五],[陈九],[赵七],[孙六])) up
/*
姓名	达标	姓名2
销量达标	N	张三
销量达标	N	李四
销量达标	Y	王五
销量达标	Y	陈九
销量达标	Y	赵七
销量达标	Y	孙六
质量达标	Y	张三
质量达标	N	李四
质量达标	N	王五
质量达标	N	陈九
质量达标	N	赵七
质量达标	N	孙六
*/
go

select * from (
select * from t unpivot ( [达标] for [姓名2] IN ([张三],[李四],[王五],[陈九],[赵七],[孙六])) up
) as tt
where tt.姓名='销量达标' and 达标='Y'
/*
姓名	达标	姓名2
销量达标	Y	王五
销量达标	Y	陈九
销量达标	Y	赵七
销量达标	Y	孙六
*/
蜗牛学编程 2020-08-08
  • 打赏
  • 举报
回复
网上有种做法说是先作行列转换,提取完数据后再转回来。 但不知道该怎么写这语句。 另外,除了这方法外,还有其他方法吗?要提取符合要求的字段名。因为如果不是一行多列,而是多行多列,那行列转换好像就很麻烦了。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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