一个数据显示报表的问题.

zf_wl 2017-09-05 02:12:48

上面图是已经实现的效果,附代码
SELECT  t.cPersonCode 检查人, t.cUnusualType 检查类别 , MAX(合格) AS 合格 , MAX(不合格) AS 不合格
FROM ( SELECT a.cPersonCode , b.cUnusualType , SUM(CASE WHEN b.bQualified = 1 THEN 1 ELSE 0 END) AS 合格 ,
SUM(CASE WHEN b.bQualified = 2 THEN 1 ELSE 0 END) AS 不合格 FROM dbo.t_HrJobInspect a
INNER JOIN dbo.t_HrJobInspectEntry b ON b.cCode = a.cCode WHERE a.cCheckDate = '2017-09-01'
GROUP BY cCheckDate , a.cPersonCode , b.cUnusualType , bQualified ) t
GROUP BY t.cPersonCode , t.cUnusualType
ORDER BY t.cPersonCode,t.cUnusualType

想要改成下图的效果做报表.代码应该如何修改.

...全文
307 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2017-09-05
  • 打赏
  • 举报
回复
引用 5 楼 guixiguixi 的回复:
[quote=引用 4 楼 yenange 的回复:] 没办要=》没必要
存储过程的方式我会弄. 特定情况, 不能用存储过程. 就是不会一句代码能实现效果.[/quote] 说了用语句也一样, 如果你的种类固定, 可以直接“一句代码”。 如果不固定, 还是得拼SQL 。 这种用不用.net 程序没什么关系。
繁花尽流年 2017-09-05
  • 打赏
  • 举报
回复
引用 2 楼 guixiguixi 的回复:
[quote=引用 1 楼 zengertao 的回复:]
CREATE TABLE #tmp1
(
	checkman VARCHAR(20), checktype VARCHAR(20), pass INT, nopass INT
)

INSERT INTO #tmp1
SELECT 'a001', '5S类', 25, 5 UNION ALL
SELECT 'a001', '质量类', 29, 1 UNION ALL
SELECT 'b002', '计划类', 20, 5 

DECLARE @str VARCHAR(MAX),@sql VARCHAR(MAX)
SET @str=N''
SET @sql=N''

SELECT @str=@str+N',['+checktype+N'(pass)]'+N',['+checktype+N'(nopass)]'
FROM   #tmp1
GROUP BY checktype

SELECT  @str=STUFF(@str,1,1,N'')

SET @sql=N'
SELECT checkman,'+@str+'
FROM   (
           SELECT checkman, checktype+''(''+checktype_p+'')'' AS checktype_p,val
           FROM   (
                      SELECT checkman, checktype, SUM(pass) AS pass, SUM(nopass) AS nopass
                      FROM   #tmp1
                      GROUP BY checkman, checktype
                  ) a
                  UNPIVOT(val FOR checktype_p IN (pass, nopass)) b
       ) c
       PIVOT(MAX(val) FOR checktype_p IN ('+@str+')) p'
       
EXEC (@sql)
checkman 5S类(pass) 5S类(nopass) 计划类(pass) 计划类(nopass) 质量类(pass) 质量类(nopass) -------------------- ----------- ----------- ----------- ----------- ----------- ----------- a001 25 5 NULL NULL 29 1 b002 NULL NULL 20 5 NULL NULL
我的原始数据是这样的. 有没有一句代码执行出效果...因为我要写在.net代码里.所以不能用临时表.等其他的东西[/quote] 临时表只是数据集而已,我想数据集字段替换这些你都明白。唯一麻烦的就是那段动态拼接新字段了,。net里如果你觉得应用很麻烦的话可以根据你的实际数据情况直接枚举出来写成固定字段也是一样的效果。
zf_wl 2017-09-05
  • 打赏
  • 举报
回复
引用 4 楼 yenange 的回复:
没办要=》没必要
存储过程的方式我会弄. 特定情况, 不能用存储过程. 就是不会一句代码能实现效果.
吉普赛的歌 版主 2017-09-05
  • 打赏
  • 举报
回复
没办要=》没必要
吉普赛的歌 版主 2017-09-05
  • 打赏
  • 举报
回复
引用 2 楼 guixiguixi 的回复:
我的原始数据是这样的. 有没有一句代码执行出效果...因为我要写在.net代码里.所以不能用临时表.等其他的东西
你要的效果, 无非是行列转置。 他为了模拟一些数据, 用到了临时表来存放, 你是真实表就没办要了。 在 .net 里, 一样可以用临时表, 一样可以用大段的语句。 不过建议你将这些看懂, 写在存储过程。 .net 直接调用存储过程就好。
zf_wl 2017-09-05
  • 打赏
  • 举报
回复
引用 1 楼 zengertao 的回复:
CREATE TABLE #tmp1
(
checkman VARCHAR(20), checktype VARCHAR(20), pass INT, nopass INT
)

INSERT INTO #tmp1
SELECT 'a001', '5S类', 25, 5 UNION ALL
SELECT 'a001', '质量类', 29, 1 UNION ALL
SELECT 'b002', '计划类', 20, 5

DECLARE @str VARCHAR(MAX),@sql VARCHAR(MAX)
SET @str=N''
SET @sql=N''

SELECT @str=@str+N',['+checktype+N'(pass)]'+N',['+checktype+N'(nopass)]'
FROM #tmp1
GROUP BY checktype

SELECT @str=STUFF(@str,1,1,N'')

SET @sql=N'
SELECT checkman,'+@str+'
FROM (
SELECT checkman, checktype+''(''+checktype_p+'')'' AS checktype_p,val
FROM (
SELECT checkman, checktype, SUM(pass) AS pass, SUM(nopass) AS nopass
FROM #tmp1
GROUP BY checkman, checktype
) a
UNPIVOT(val FOR checktype_p IN (pass, nopass)) b
) c
PIVOT(MAX(val) FOR checktype_p IN ('+@str+')) p'

EXEC (@sql)


checkman 5S类(pass) 5S类(nopass) 计划类(pass) 计划类(nopass) 质量类(pass) 质量类(nopass)
-------------------- ----------- ----------- ----------- ----------- ----------- -----------
a001 25 5 NULL NULL 29 1
b002 NULL NULL 20 5 NULL NULL




我的原始数据是这样的. 有没有一句代码执行出效果...因为我要写在.net代码里.所以不能用临时表.等其他的东西
繁花尽流年 2017-09-05
  • 打赏
  • 举报
回复
CREATE TABLE #tmp1
(
	checkman VARCHAR(20), checktype VARCHAR(20), pass INT, nopass INT
)

INSERT INTO #tmp1
SELECT 'a001', '5S类', 25, 5 UNION ALL
SELECT 'a001', '质量类', 29, 1 UNION ALL
SELECT 'b002', '计划类', 20, 5 

DECLARE @str VARCHAR(MAX),@sql VARCHAR(MAX)
SET @str=N''
SET @sql=N''

SELECT @str=@str+N',['+checktype+N'(pass)]'+N',['+checktype+N'(nopass)]'
FROM   #tmp1
GROUP BY checktype

SELECT  @str=STUFF(@str,1,1,N'')

SET @sql=N'
SELECT checkman,'+@str+'
FROM   (
           SELECT checkman, checktype+''(''+checktype_p+'')'' AS checktype_p,val
           FROM   (
                      SELECT checkman, checktype, SUM(pass) AS pass, SUM(nopass) AS nopass
                      FROM   #tmp1
                      GROUP BY checkman, checktype
                  ) a
                  UNPIVOT(val FOR checktype_p IN (pass, nopass)) b
       ) c
       PIVOT(MAX(val) FOR checktype_p IN ('+@str+')) p'
       
EXEC (@sql)
checkman 5S类(pass) 5S类(nopass) 计划类(pass) 计划类(nopass) 质量类(pass) 质量类(nopass) -------------------- ----------- ----------- ----------- ----------- ----------- ----------- a001 25 5 NULL NULL 29 1 b002 NULL NULL 20 5 NULL NULL

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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