求一个SQL

Top_小鑫 2019-02-01 05:32:47

数据如上图
我想查询的结果如下图

半天没弄出来 ,
根据订单创建时间统计,统计结果 只有四行,订单总数那一列应该都是一样的
其余的都是统计出后的数据。
求SQL大神指点,非常感谢。。快过年了,祝愿大家新的一年财源滚滚,步步高升。
...全文
95 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2019-02-02
  • 打赏
  • 举报
回复

create table tab0202
(HIC订单号 varchar(30),订单创建时间 datetime,
POD是否上传 varchar(5),准时发车 varchar(5),准时操作到达 varchar(5),准时操作签收 varchar(5),准时配送 varchar(5))

insert into tab0202
select '15811901250004','2019-01-25 08:40:40','否','是','否','是','否' union all
select '15811901250529','2019-01-25 16:39:46','否','否','否','是','否' union all
select '15811901250544','2019-01-25 16:40:08','否','否','是','否','否' union all
select '15811901280011','2019-01-28 08:47:16','否','否','是','是','否' union all
select '15811901280583','2019-01-28 17:20:09','否','是','是','否','否' union all
select '15811901280594','2019-01-28 17:20:32','否','是','是','否','否' union all
select '15811901290267','2019-01-29 16:19:54','否','否','否','否','否' union all
select '15811901290270','2019-01-29 16:19:52','否','否','是','否','否' union all
select '15811901300042','2019-01-30 09:32:43','否','是','是','是','否' union all
select '15211901300050','2019-01-30 09:33:02','否','是','是','是','否'


with t as
(select * from tab0202)
select 类型=FType+'率',
总订单=(select count(1) from t),
数量=sum(case when val='是' then 1 else 0 end),
占比=rtrim(cast(sum(case when val='是' then 1 else 0 end)/(select count(1)*1.0 from t)*100 as int))+'%'
from (select FType=b.col,b.val
from t a
unpivot(val for col in([POD是否上传],[准时发车],[准时操作到达],[准时操作签收],[准时配送])) b) c
group by FType
order by (select column_id from sys.columns d where d.object_id=object_id('tab0202') and d.name=c.FType)

/*
类型 总订单 数量 占比
------------------------- ----------- ----------- -------------
POD是否上传率 10 0 0%
准时发车率 10 5 50%
准时操作到达率 10 7 70%
准时操作签收率 10 5 50%
准时配送率 10 0 0%

(5 row(s) affected)
*/
RINK_1 2019-02-01
  • 打赏
  • 举报
回复
试试


WITH CTE 
AS
(SELECT COUNT(*) AS 订单总数,
SUM(CASE WHEN POD是否上传='是' THEN 1 ELSE 0 END) AS POD是否上传,
SUM(CASE WHEN 准时配送='是' THEN 1 ELSE 0 END) AS 准时配送,
SUM(CASE WHEN 准时发车='是' THEN 1 ELSE 0 END) AS 准时发车,
SUM(CASE WHEN 准时操作到达='是' THEN 1 ELSE 0 END) AS 准时操作到达次数,
SUM(CASE WHEN 准时操作签收='是' THEN 1 ELSE 0 END) AS 准时操作签收次数
FROM TABLE)

SELECT 'POD上传率' AS 类型,订单总数,POD是否上传 AS 数量,CAST(CAST((POD是否上传*1.0)/订单总数*100 AS DECIMAL(12,2)) AS VARCHAR) +'%' AS 占比 FROM CTE
UNION ALL
SELECT '准时发车',订单总数,准时发车,CAST(CAST((准时发车*1.0)/订单总数*100 AS DECIMAL(12,2)) AS VARCHAR) +'%' AS 准时发车率 FROM CTE
UNION ALL
SELECT '准时操作到达',订单总数,POD是否上传,CAST(CAST((准时操作到达次数*1.0)/订单总数*100 AS DECIMAL(12,2)) AS VARCHAR) +'%' AS 准时操作到达率 FROM CTE
UNION ALL
SELECT '准时操作签收',订单总数,准时操作签收次数,CAST(CAST((准时操作签收次数*1.0)/订单总数*100 AS DECIMAL(12,2)) AS VARCHAR) +'%' AS 准时操作签收率 FROM CTE
UNION ALL
SELECT '准时配送',订单总数,准时配送,CAST(CAST((准时配送*1.0)/订单总数*100 AS DECIMAL(12,2)) AS VARCHAR) +'%' AS 准时配送率 FROM CTE
Top_小鑫 2019-02-01
  • 打赏
  • 举报
回复
引用 5 楼 唐诗三百首 的回复:
还有, 原始表的"POD是否..."列列名显示不全? POD上传率和配载准时率在原始表中找不到数据列? 请提供表结构,测试数据,处理逻辑和希望结果? 建议发帖时, 打完字后,请至少自己先读一遍,确保没有错别字,逻辑清楚,能读懂了再发出来. 应考虑从阅读者的角度去理解问题,不应该浪费别人时间来猜你的意思. 自己的时间宝贵, 别人花时间帮你解决问题的时间,也同样宝贵.
就那10条数据为例,上面就是查询的结果。
Top_小鑫 2019-02-01
  • 打赏
  • 举报
回复
Count
引用 5 楼 唐诗三百首 的回复:
还有, 原始表的"POD是否..."列列名显示不全? POD上传率和配载准时率在原始表中找不到数据列? 请提供表结构,测试数据,处理逻辑和希望结果? 建议发帖时, 打完字后,请至少自己先读一遍,确保没有错别字,逻辑清楚,能读懂了再发出来. 应考虑从阅读者的角度去理解问题,不应该浪费别人时间来猜你的意思. 自己的时间宝贵, 别人花时间帮你解决问题的时间,也同样宝贵.
COUNT 打错了。
Top_小鑫 2019-02-01
  • 打赏
  • 举报
回复
引用 5 楼 唐诗三百首 的回复:
还有, 原始表的"POD是否..."列列名显示不全? POD上传率和配载准时率在原始表中找不到数据列? 请提供表结构,测试数据,处理逻辑和希望结果? 建议发帖时, 打完字后,请至少自己先读一遍,确保没有错别字,逻辑清楚,能读懂了再发出来. 应考虑从阅读者的角度去理解问题,不应该浪费别人时间来猜你的意思. 自己的时间宝贵, 别人花时间帮你解决问题的时间,也同样宝贵.
查询结果的名称我自己定义的,起始就是查询表里的那个列 名字一样的,只是因为是统计 所有 后面加了个率。 比如,准时发车列,统计结果我就显示为准时车率,订单数量就是所有订单SUM 数量=SUM( 准时发车=‘是’) 后面的占比 就是数量/订单数。 不知道这样说,你是否明白。
唐诗三百首 2019-02-01
  • 打赏
  • 举报
回复
还有,
原始表的"POD是否..."列列名显示不全?
POD上传率和配载准时率在原始表中找不到数据列?
请提供表结构,测试数据,处理逻辑和希望结果?

建议发帖时, 打完字后,请至少自己先读一遍,确保没有错别字,逻辑清楚,能读懂了再发出来.
应考虑从阅读者的角度去理解问题,不应该浪费别人时间来猜你的意思.
自己的时间宝贵, 别人花时间帮你解决问题的时间,也同样宝贵.
Top_小鑫 2019-02-01
  • 打赏
  • 举报
回复
引用 3 楼 唐诗三百首 的回复:
从查询结果图看, 似乎和"根据订单创建时间统计"没什么关系?
根据订单创建时间,只能说明 统计表数据的结果记录。 相当于根据创建时间,查询多少条记录 然后再在这记录中去统计每个列的数据 单个列的话应该用 select 列名 from 表名 group by 列名 having count(列名) =‘是’ 估计就可以,难道多列,我要创建一个临时表 每条记录自己去插入吗? 大神 有没有快捷点的方法。本人对SQL这块不是很熟悉。望大神指点下,感谢!
唐诗三百首 2019-02-01
  • 打赏
  • 举报
回复
从查询结果图看, 似乎和"根据订单创建时间统计"没什么关系?
Top_小鑫 2019-02-01
  • 打赏
  • 举报
回复
相当于进行了,表中列的数据统计。
Top_小鑫 2019-02-01
  • 打赏
  • 举报
回复
查询结果图 在这里,不知道为什么没上传上去

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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