Sql server 选择脚本以包含另一个表的计数?
我试图找出如何编写一个脚本,从一个表中选择某些记录/字段,然后将其连接到另一个表中,并包含一个对应计数的列。例如,这就是我现在拥有的:Sql server 选择脚本以包含另一个表的计数?,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我试图找出如何编写一个脚本,从一个表中选择某些记录/字段,然后将其连接到另一个表中,并包含一个对应计数的列。例如,这就是我现在拥有的: select ID, Val from OriginalTable where Something = 1 现在我有了另一个表,其中有链接到此原始表的记录,其中a列OriginalID与OriginalTable的ID匹配。一个例子是: select * from OtherTable where OriginalID = 3 …其中3=原始表的ID 我想做
select ID, Val from OriginalTable where Something = 1
现在我有了另一个表,其中有链接到此原始表的记录,其中a列OriginalID
与OriginalTable
的ID
匹配。一个例子是:
select * from OtherTable where OriginalID = 3
…其中3=原始表的ID
我想做的是在第一条语句中添加一列,该列显示另一个表的计数,如第二个查询中所示。例如,这可能是一个结果集:
ID Val Count
1 abc 15
2 def 23
3 ghi 42
4 jkl 19
如何编写此查询以包含此计数?有很多方法可以做到这一点,但您可以使用
分组方式
select ID, Val, [Count] = count(1)
from OriginalTable be
left join OtherTable ot on be.OriginalID = ot.OriginalID
where Something = 1
group by ID,Val
或者您可以使用覆盖
和分区
:
select ID, Val, [Count] = count(1) OVER(PARTITION BY ID,Val)
from OriginalTable be
left join OtherTable ot on be.OriginalID = ot.OriginalID
where Something = 1
我个人喜欢
而不是方法。MSDN上有一些信息。子查询应该为您处理这些信息:
SELECT
ID, Val, Cnt
FROM OriginalTable
JOIN (
SELECT
OriginalID, COUNT(*) AS Cnt
FROM OtherTable
GROUP BY OriginalID
) AS Sub ON ID=OriginalID
尴尬的是,be
实际上完全符合我最初打算将其转换为的内容:哎呀,哎呀,我忘了删除它。实际上,我试图重新编写它,但不包括业务特定的内容,不管怎样,这对我有效,现在接受哪个答案?在你的回答中,中的1算(1)
代表什么?我试图使用您的示例,因为我认为这是我所需要的,但是我现在使用OVER
方法为每一行返回了许多结果(重复行),但是在我的查询中,不是1,而是我希望它的列countcountcount(1)或Count(*)是可互换的,但不同于Count(col),Count(col)在列中不包含null。看见也许曾经有一段时间,它们是不同的(早期的oracle或sql server),这最终成为最适合我的例子,谢谢。使用SQL报表生成器似乎不喜欢上面的过度分区方法
SELECT be.ID, be.Val, Count(*) AS [Count]
FROM OriginalTable be
LEFT OUTER JOIN OtherTable ot ON be.ID = ot.OriginalID
WHERE be.Something = 1
GROUP BY be.ID, be.Val
SELECT
ID, Val, Cnt
FROM OriginalTable
JOIN (
SELECT
OriginalID, COUNT(*) AS Cnt
FROM OtherTable
GROUP BY OriginalID
) AS Sub ON ID=OriginalID