为了使示例超级简单,假设我有一个包含三行,ID,Name和Date的表。我需要找到属于特定名称的所有ID的计数,其中ID不属于本月。
使用那个例子,我想要这个输出:
换句话说,我想要计算一个名称有多少ID,而不是这个月/年。
我更喜欢PowerShell,而且还是SQL的新手。我尝试做一个case语句,但因为它不是foreach它似乎返回“如果Name在这个月有任何日期,返回NULL”这不是我想要的。我想要计算这个月没有出现每个名字的ID数。
SELECT NAME,
CASE
WHEN ( Month(date) NOT LIKE Month(Getdate())
AND Year(date) NOT LIKE Year(Getdate()) ) THEN Count(id)
END AS TotalCount
FROM dbo.table
GROUP BY NAME,
date
我真的希望这是有道理的,但如果不是,请告诉我,我可以尝试澄清更多。我尝试过研究游标,但是我很难抓住它们进入我的声明。任何帮助将不胜感激!
答案 0 :(得分:1)
您只想按结果集中的非聚合列进行分组(在本例中为Name
)。你完全不需要光标,这是一个相当简单的查询。
select
Name,
Count(*) count
from
tbl
where
tbl.date > eomonth(getdate()) or
tbl.date <= eomonth(dateadd(mm, -1, getdate())
group by
Name
我在排除本月的行时做了一些诡计。通常,您希望避免在要比较的列上运行函数,以便SQL Server可以使用索引来加速其搜索。我认为ID
列是唯一的,如果不是,请将count(*)
更改为count(distinct ID)
。
替代where
子句。如果表足够小,你可以直接执行它(类似于你最初尝试的那样,它只是在查询where子句中而不是嵌入在一个case中)
where
Month(date) <> Month(Getdate())
AND Year(date) <> Year(Getdate())
如果你有一个大表并且索引上的索引非常重要,那么你可以使用eomonth
和日期部分功能构建dateadd
一些有趣的东西,但这很痛苦。
答案 1 :(得分:0)
SELECT Name, COUNT(ID) AS TotalCount
FROM dbo.[table]
WHERE DATEPART(MONTH, [Date]) != DATEPART(MONTH, GETDATE()) OR DATEPART(YEAR, [Date]) != DATEPART(YEAR, GETDATE())
GROUP BY Name;
答案 2 :(得分:-2)
在T-SQL中:
SELECT
NAME,
COUNT(id)
FROM dbo.table
WHERE MONTH(Date_M) <> MONTH(GETDATE())
GROUP BY NAME