牛红光的回答:求总发卡数和总制卡数和发卡正式卡数、发卡临时卡数、发卡正式卡数,制卡临时卡数、制卡正式卡数(如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分支,其他情况下居然返回了空字符串,字符型。这两个不一致,首先就错了。你先改了这些吧。 查小欣的回答:case when 就是case when 判断 case when 当满足条件 then 。。。 when ...... then ... 可以写很多种情况,直到结束 |