常见SQL

Create table #tab([id] nvarchar(23),[invoiceid] nvarchar(23))
Insert #tab
select N'001',N'*' union all
select N'001',N'*' union all
select N'001',N'123' union all
select N'002',N'234' union all
select N'002',N'456' union all
select N'003',N'*' union all
select N'003',N'*' union all
select N'003',N'*'
GO

id      invoiceid
001    *
001    *
001   123
002   234
002   456
003    *
003    *
003    *

得到这样的结果
id      state  
001   部分开票
002   全部开票
003   全部未开

state代表开票状态,比如同一个id下的,inoviceid全部为星号就代表全部开票;
如果invoiceid既有星号,又有数字的,代表部分开票;
如果invocieid全部为数字的,就代表全部开票

SELECT id,
    CASE SUM(DISTINCT CASE invoiceid WHEN '*' THEN 1 ELSE 2 END)
        WHEN 1 THEN '全部未开' WHEN 2 THEN '全部开票' WHEN 3 THEN '部分开票'
    END
FROM tb
GROUP BY id


二 用户号,单号,时间,金额,求每个用户每天前50笔里,金额大于10元的数据有多少
CREATE  TABLE  t(用户号  int ,单号  INT ,时间 DATETIME, 金额  int )

INSERT  INTO  VALUES  (1,1, '2018-01-21 08:00' ,11)
INSERT  INTO  VALUES  (1,2, '2018-01-21 09:00' ,12)
INSERT  INTO  VALUES  (1,3, '2018-01-21 10:00' ,20)
INSERT  INTO  VALUES  (2,4, '2018-01-21 11:00' ,3)
INSERT  INTO  VALUES  (2,5, '2018-01-21 12:00' ,15)
INSERT  INTO  VALUES  (2,6, '2018-01-21 13:00' ,5)
INSERT  INTO  VALUES  (3,7, '2018-01-22 08:00' ,30)

先按用户号和单据日期分组,将每天的数据分组排序,最后取序号(rid)小于等于50的数据

WITH  cte  AS  (
     SELECT  ROW_NUMBER() OVER (PARTITION  BY  用户号, convert ( CHAR (10),时间,120)  order  by  时间  desc as  rid
     ,*
     FROM  t
     WHERE  金额>10   
)

SELECT 
     用户号
     , convert ( CHAR (10),时间,120)  as  时间
     , COUNT (1)  AS  笔数
     , SUM (金额)  AS  金额
FROM  cte
WHERE  rid<=50
GROUP  BY  用户号, convert ( CHAR (10),时间,120)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值