我有以下存储过程,到目前为止工作正常。
是否有更快/更好的方法来写这个,这样我就不必为每个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>
非常感谢你提供任何帮助,蒂姆。
答案 0 :(得分:1)
看起来你想要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')
答案 1 :(得分:1)
我认为其他发布的查询在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')