牛红光的回答:
求总发卡数和总制卡数和发卡正式卡数、发卡临时卡数、发卡正式卡数,制卡临时卡数、制卡正式卡数(如Excel中所示)求详细SQL语句。 --创建测试表 IF??EXISTS?(SELECT?*?FROM?sys.objects?WHERE?object_id?=?OBJECT_ID(N"[dbo].[TB]")?AND?type?in?(N"U")) DROP?TABLE?[dbo].[TB1] GO CREATE?TABLE?[dbo].[TB1]( ????[卡状态]?[nvarchar]?(20)?NULL, ????[卡类型]?[nvarchar](50)?NULL, )?ON?[PRIMARY] GO --插入测试数据 INSERT?INTO?[TB1]?([卡状态],[卡类型])? ????SELECT?N"发卡",N"正式卡"?UNION?ALL SELECT?N"发卡",N"正式卡"?UNION?ALL SELECT?N"发卡",N"临式卡"?UNION?ALL SELECT?N"制卡",N"临式卡"?UNION?ALL SELECT?N"制卡",N"正式卡" GO --静态拼接行转列(纠正简化一下) SELECT??卡状态?+?"数"?AS?卡状态, ????????COUNT(1)?AS?总数?, ????????SUM(CASE?WHEN?卡类型?=?"正式卡"?THEN?1 ?????????????????ELSE?0 ????????????END)?AS?正式卡?, ????????SUM(CASE?WHEN?卡类型?=?"临式卡"?THEN?1 ?????????????????ELSE?0 ????????????END)?AS?临式卡 FROM????TB1 GROUP?BY?卡状态 ?GO --输出结果:
欧阳林的回答:
求总发卡数和总制卡数和发卡正式卡数、发卡临时卡数、发卡正式卡数,制卡临时卡数、制卡正式卡数(如Excel中所示)求详细SQL语句。 --创建测试表 IF??EXISTS?(SELECT?*?FROM?sys.objects?WHERE?object_id?=?OBJECT_ID(N"[dbo].[TB]")?AND?type?in?(N"U")) DROP?TABLE?[dbo].[TB1] GO CREATE?TABLE?[dbo].[TB1]( ????[卡状态]?[nvarchar]?(20)?NULL, ????[卡类型]?[nvarchar](50)?NULL, )?ON?[PRIMARY] GO --插入测试数据 INSERT?INTO?[TB1]?([卡状态],[卡类型])? ????SELECT?N"发卡",N"正式卡"?UNION?ALL SELECT?N"发卡",N"正式卡"?UNION?ALL SELECT?N"发卡",N"临式卡"?UNION?ALL SELECT?N"制卡",N"临式卡"?UNION?ALL SELECT?N"制卡",N"正式卡" GO --静态拼接行转列(纠正简化一下) SELECT??卡状态?+?"数"?AS?卡状态, ????????COUNT(1)?AS?总数?, ????????SUM(CASE?WHEN?卡类型?=?"正式卡"?THEN?1 ?????????????????ELSE?0 ????????????END)?AS?正式卡?, ????????SUM(CASE?WHEN?卡类型?=?"临式卡"?THEN?1 ?????????????????ELSE?0 ????????????END)?AS?临式卡 FROM????TB1 GROUP?BY?卡状态 ?GO --输出结果:
茫茫大海的回答:
太长了,但是看到一个问题,case when,要求返回的类型必须一直。 你看你的第一个case when语句 (case when to_char(statistic_date-payrefdate>=0) and to_char(statistic_date-payrefdate<90) then sum(a.planfee-nvl(c.payreffee,0)) else '' end) then后边返回的是一个求和,那么类型肯定是数字,而else分支,其他情况下居然返回了空字符串,字符型。这两个不一致,首先就错了。你先改了这些吧。
查小欣的回答: