常见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 时间 descas 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)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值