【发布时间】:2014-11-24 15:46:44
【问题描述】:
我必须改进这个查询,效果很好。
DECLARE @timTimeout int,
@iniDate varchar(20),
@endDate varchar(20)
SET @iniDate = '2014-07-20 00:00:00'
SET @endDate = '2014-11-24 23:59:59'
SET @timTimeout = 4000
SET ANSI_WARNINGS OFF
SELECT
'Approved (0200)' = ISNULL(SUM(CASE CodMsgIncome WHEN '0200' THEN 1 END), 0),
'Approved Off (0220)' = ISNULL(SUM(CASE CodMsgIncome WHEN '0220' THEN 1 END), 0),
'Cancel (0400)' = ISNULL(SUM(CASE CodMsgIncome WHEN '0400' THEN 1 END), 0),
'Regret (0420)' = ISNULL(SUM(CASE CodMsgIncome WHEN '0420' THEN 1 END), 0),
'TOTAL' = COUNT(*),
'Time-outs' = ISNULL(SUM(CASE WHEN DATEDIFF(ms, DateMsgIncome, DateMsgSent) > @timTimeout THEN 1 END), 0),
'Disponibility (%)' = (1 - CAST(ISNULL(SUM(CASE WHEN DATEDIFF(ms, DateMsgIncome, DateMsgSent) > @timTimeout THEN 1 END), 0) as money) / COUNT(*)) * 100
FROM Message (NOLOCK)
WHERE DateMsgIncome BETWEEN @iniDate AND @endDate
AND CodMsgIncome IN ('0200', '0220', '0400', '0420', '0800', '0900', '9080', '9085')
AND DescMsgIncome <> '0220'
现在,我必须准备一份包含按月组织的总数据的报告。
disered 的输出看起来像这样:
Approved (0200) | Approved Off (0220) | Cancel | Total | Time-outs | Disponibility (%)
July | 35 15 12 62 0 100.00
.
.
.
编辑: 我的查询中只有一张表。
Table Message:
DateMsgIncome date,
DateMsgSent date,
CodMsgIncome varchar(4),
DescMsgIncome varchar(4),
CodMsgAnswer int.
欢迎提出任何建议。 提前致谢。
【问题讨论】:
-
您没有收到任何错误,是吗?您想以何种方式改进该查询?速度方面,美学方面,还是什么?
-
好吧,我不知道如何按月对数据进行分组。这是我想要的改进。
-
这是模糊的,因为你没有描述你有什么表结构。当我们甚至不知道从哪个列中选择那个月份时,我们怎么知道如何按月份分组呢? (例如 DateMsgIncome、DateMsgSent 似乎都是 DateTime 列)
-
除此之外,向查询添加分组并不是我所说的改进,而更像是更改请求;)
-
所以添加一个 GROUP BY 你的两个日期列之一的月份。我们不知道是哪一个。
标签: sql sql-server