我具有以下到目前为止可以正常工作的存储过程。
是否有更快/更好的方式编写此代码,这样我就不必向每个Select添加相同的From行?
我的存储过程:
ALTER PROCEDURE [dbo].[CountEsc]
@date0 nvarchar(20),
@date1 nvarchar(20),
@date2 nvarchar(20),
@date3 nvarchar(20),
@date4 nvarchar(20),
@date5 nvarchar(20)
AS
BEGIN
SET NOCOUNT ON;
SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE dateEsc LIKE @date0+'%'
UNION ALL
SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE dateEsc LIKE @date1+'%'
UNION ALL
SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE dateEsc LIKE @date2+'%'
UNION ALL
SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE dateEsc LIKE @date3+'%'
UNION ALL
SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE dateEsc LIKE @date4+'%'
UNION ALL
SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE dateEsc LIKE @date5+'%'
FOR XML PATH(''), ROOT('ranks')
END
我生成的XML:
<ranks>
<groupCount>0</groupCount>
<groupCount>5</groupCount>
<groupCount>3</groupCount>
<groupCount>6</groupCount>
<groupCount>1</groupCount>
<groupCount>0</groupCount>
</ranks>
似乎您希望按dateEsc来计数记录,但需要特定的日期列表。
我的第一个问题是:您使用LIKE匹配是否有原因?
下面的SQL可能会给您预期的结果:
SET NOCOUNT ON;
SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE dateEsc LIKE @date0+'%'
OR dateEsc LIKE @date1+'%'
OR dateEsc LIKE @date2+'%'
OR dateEsc LIKE @date3+'%'
OR dateEsc LIKE @date4+'%'
OR dateEsc LIKE @date5+'%'
GROUP BY dateEsc
FOR XML PATH(''), ROOT('ranks')
我认为其他发布的查询在count为零时将不会显示值。
这是我的努力-
Create Table #temp
(
date Datetime NULL
)
Insert into #temp values (CONVERT(VARCHAR(10),@date0,110))
Insert into #temp values (CONVERT(VARCHAR(10),@date1,110))
Insert into #temp values (CONVERT(VARCHAR(10),@date2,110))
Insert into #temp values (CONVERT(VARCHAR(10),@date3,110))
Insert into #temp values (CONVERT(VARCHAR(10),@date4,110))
Insert into #temp values (CONVERT(VARCHAR(10),@date5,110))
SELECT
sum(Case when dateEsc is null then 0 else 1 end) AS groupCount
FROM #temp t1 left join dateEsc t2 on t1.date = CONVERT(VARCHAR(10),dateEsc,110)
group by date
FOR XML PATH(''), ROOT('ranks')