SQL语句 判断 开票状态 求助!!!!

zm_zhang 2019-03-18 05:20:22


各位大佬,小弟有事相求:
我想判断:
1.当开票状态中都为 0 时,显示 '未开票'
2.当开票状态中都为 1 时,显示 ‘已开票’
3.当开票状态中 有 0 和 1 时,显示 ’部分开票‘
...全文
283 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2019-03-20
  • 打赏
  • 举报
回复
没数据的要用isnull转换一下:
DECLARE @t TABLE(finvflag VARCHAR(3) NOT NULL)
INSERT @t(finvflag)
VALUES('0'),('0'),('1');

WITH tt AS (
SELECT ISNULL(SUM(CASE WHEN finvflag='1' THEN 1 ELSE 0 END),0) 已开数量,
ISNULL(SUM(CASE WHEN finvflag='0' THEN 1 ELSE 0 END),0) 未开数量 FROM @t)
SELECT CASE WHEN tt.已开数量>0 AND tt.未开数量>0 THEN '部分开'
WHEN tt.已开数量=0 AND tt.未开数量=0 THEN '没数据'
WHEN tt.已开数量=0 AND tt.未开数量>0 THEN '未开'
ELSE '全开' END 状态
FROM tt
Hello World, 2019-03-20
  • 打赏
  • 举报
回复
先汇总已开和未开的数量,再比较,得到状态
DECLARE @t TABLE(finvflag VARCHAR(3) NOT NULL)
INSERT @t(finvflag)
VALUES('0'),('0'),('1');

WITH tt AS (
SELECT SUM(CASE WHEN finvflag='1' THEN 1 ELSE 0 END) 已开数量,
SUM(CASE WHEN finvflag='0' THEN 1 ELSE 0 END) 未开数量 FROM @t)
SELECT CASE WHEN tt.已开数量>0 AND tt.未开数量>0 THEN '部分开'
WHEN tt.已开数量=0 AND tt.未开数量=0 THEN '没数据'
WHEN tt.已开数量=0 AND tt.未开数量>0 THEN '未开'
ELSE '全开' END 状态
FROM tt
victor_yang 2019-03-20
  • 打赏
  • 举报
回复
引用 4 楼 zm_zhang 的回复:


大佬,我用的是SQL SERVER2008 ,


我以为你的字段是数字型的,sum里面改下转换成数字型就好
阿·修 2019-03-20
  • 打赏
  • 举报
回复
感觉说的还不够清楚,t_copd_dlvmst 这个表有哪些列?例如【当开票状态中 有 0 和 1 时,显示'部分开票' 】这句话就有歧义,我可以理解为:“某客户的发票的发票的状态有0和1时,则这个顾客的所有发票”的状态均显示为“部分开票”,或者理解为“当我根据顾客分组查询时,其发票状态为‘部分开票’”,如果再加入日期属性,恐怕会更复杂。同样的,这里的【顾客】可以换成【日期】【产品】【供应商】,同样可以引发歧义。
victor_yang 2019-03-20
  • 打赏
  • 举报
回复
SELECT 开票状态=CASE
WHEN COUNT(DISTINCT finvflag)=2 THEN '部分开票'
WHEN COUNT(DISTINCT finvflag)=1 AND SUM(convert(int,Isnull(finvflag,'0')))=0 THEN '未开票'
WHEN COUNT(DISTINCT finvflag)=1 AND SUM(convert(int,Isnull(finvflag,'0')))>0 THEN '已开票'
END FROM t_copd_dlvmst

这个才对
victor_yang 2019-03-20
  • 打赏
  • 举报
回复


SELECT 开票状态=CASE
WHEN COUNT(DISTINCT finvflag)=2 THEN '部分开票'
WHEN COUNT(DISTINCT finvflag)=1 AND SUM(convert(int,Isnull(finvflag,0)))=0 THEN '未开票'
WHEN COUNT(DISTINCT finvflag)=1 AND SUM(convert(int,Isnull(finvflag,0)))>0 THEN '已开票'
END FROM t_copd_dlvmst


zm_zhang 2019-03-19
  • 打赏
  • 举报
回复


大佬,我用的是SQL SERVER2008 ,
Dear SQL(燊) 2019-03-19
  • 打赏
  • 举报
回复
如果需分单,加单号GROUP BY
select case when max(isnull(finvflag,0))=min(isnull(finvflag,0)) and min(finvflag)=1 then '已开票'
			when max(isnull(finvflag,0))=min(isnull(finvflag,0)) and min(isnull(finvflag,0))=0 then '未开票'
			else '部分开票'
	   end 
from t_copd_dlvmst
Hello World, 2019-03-19
  • 打赏
  • 举报
回复
DECLARE @t TABLE(finvflag BIT NOT NULL)
INSERT @t(finvflag)
VALUES(0),(0),(1);
WITH t AS(
SELECT DISTINCT finvflag FROM @t) --状态去重
SELECT TOP(1)
CASE WHEN LEAD(finvflag) OVER (ORDER BY finvflag) IS NULL --如果有下一记录则代表有0和1,否则只有0或者只有1
THEN CASE WHEN t.finvflag=1 THEN '全开' ELSE '未开' END
ELSE '部份开' END 状态 FROM t ORDER BY t.finvflag
victor_yang 2019-03-19
  • 打赏
  • 举报
回复

SELECT 开票状态=CASE
WHEN COUNT(DISTINCT finvflag)=2 THEN '部分开票'
WHEN COUNT(DISTINCT finvflag)=1 AND SUM(finvflag)=0 THEN '未开票'
WHEN COUNT(DISTINCT finvflag)=1 AND SUM(finvflag)>0 THEN '已开票'
END FROM t_copd_dlvmst

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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