11,849
社区成员
发帖
与我相关
我的任务
分享
SELECT
name,
SUM ( moneys ) bef,
SUM ( moneys ) - (SELECT SUM(3) FROM
(
SELECT
CONVERT(date,startTime) date,
CASE
WHEN CONVERT(time,startTime) BETWEEN '10:30:00' AND '14:00:00' THEN '中餐'
WHEN CONVERT(time,startTime) BETWEEN '16:30:00' AND '20:00:00' THEN '晚餐'
END type,
MAX(moneys) max_money
FROM
test
WHERE
name = '张三'
AND
(
CONVERT(time,startTime) BETWEEN '10:30:00' AND '14:00:00'
OR
CONVERT(time,startTime) BETWEEN '16:30:00' AND '20:00:00'
)
GROUP BY
CONVERT(date,startTime),
CASE
WHEN CONVERT(time,startTime) BETWEEN '10:30:00' AND '14:00:00' THEN '中餐'
WHEN CONVERT(time,startTime) BETWEEN '16:30:00' AND '20:00:00' THEN '晚餐'
END
HAVING
MAX(moneys) >= 3
) t
) aft
FROM
test
GROUP BY
name
USE tempdb
GO
IF OBJECT_ID('test') IS NOT NULL DROP TABLE test
GO
CREATE TABLE test(
id INT IDENTITY(1,1) PRIMARY KEY,
[name] NVARCHAR(10),
startTime DATETIME,
[moneys] INT
)
GO
SET NOCOUNT ON;
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-01 08:00:00.000',4);
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-01 11:00:00.000',10);
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-01 11:30:00.000',10);
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-01 17:00:00.000',10);
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-02 08:00:00.000',3);
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-02 11:20:00.000',3);
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-02 17:10:00.000',9);
INSERT INTO test([name],[startTime],[moneys]) VALUES('张三','2018-08-02 18:00:00.000',9);
--查询
;WITH cte AS (
select [name],SUM(moneys) as moneys
from test
group by [name]
)
SELECT [name]
,[moneys] AS orginalMoneys
,moneys-(CASE WHEN EXISTS(
SELECT 1 FROM test WHERE test.name=cte.name AND moneys>3 and CONVERT(time,startTime) between '10:00:00'and '20:00:00'
) THEN 3 ELSE 0 END)
AS moneys
FROM cte
/*
name orginalMoneys moneys
---------- ------------- -----------
张三 58 55
*/
select name,sum(total-discount)
from
(select name,convert(varchar(10),starttime,23) as singledate,
max(case when qty>1 then 1 else 0 end)*3 as discount,SUM(moneys) AS TOTAL
from
(select *,
sum(case when (convert(varchar(10),starttime,108) between '10:30:00' and '14:00:00'
or convert(varchar(10),starttime,108) between '16:30:00' and '20:00:00')
and moneys>3 then 1 else 0 end) over (partition by name,convert(varchar(10),starttime,23)) as qty
from test) as A
group by name,convert(varchar(10),starttime,23)) as A
group by name
[/quote]
select name,sum(total-discount)
from
(select name,convert(varchar(10),starttime,23) as singledate,
max(case when qty>1 then 1 else 0 end)*3 as discount,SUM(moneys) AS TOTAL
from
(select *,
sum(case when (convert(varchar(10),starttime,108) between '10:30:00' and '14:00:00'
or convert(varchar(10),starttime,108) between '16:30:00' and '20:00:00')
and moneys>3 then 1 else 0 end) over (partition by name,convert(varchar(10),starttime,23)) as qty
from test) as A
group by name,convert(varchar(10),starttime,23)) as A
group by name