SQL查询检索计数

时间:2018-07-10 04:33:14

标签: sql linq

随着我的SQL变得越来越生锈,我正在努力使其正常运行。 我有一个包含多个条目的表,如所附图像所示。 我需要编写一个查询,以便它向我返回条目数的计数。即在这种情况下为7。这是MainID,ItemID,DeviceID和ChannelID的不同组合

感谢您的帮助!

database image

4 个答案:

答案 0 :(得分:0)

尝试以下操作:

Select 
  Count(*)
From
(
Select
  Distinct
  MainID,
  ItemID,
  DeviceID,
  ChannelID
From
  yourtable
)X;

答案 1 :(得分:0)

IF OBJECT_ID('tempdb..#T') IS NOT NULL
    BEGIN
        DROP TABLE #T
    END

CREATE TABLE #T (
    MainId INT
    ,ItemId INT
    ,DeviceId INT
    ,ChannelId INT
)

INSERT INTO #T VALUES (1,1,2,1),(1,1,2,2),(1,1,2,3),(1,1,22,0),(1,2,1,1),(1,2,1,2)
,(1,2,1,3),(1,2,2,1),(1,2,2,2),(1,2,2,3),(1,2,3,1),(1,2,3,2),(1,2,3,3),(1,2,4,1)
,(1,2,4,2),(1,2,4,3),(1,2,5,1),(1,2,5,2),(1,2,5,3)

SELECT MainId, ItemId, DeviceId, COUNT(*) as RecordCount
FROM
    #T
GROUP BY
    MainId, ItemId, DeviceId

SELECT DISTINCT MainId, ItemId, DeviceId
FROM
    #T

SELECT *, DENSE_RANK() OVER (ORDER BY MainId, ItemId, DeviceId) as GroupNumber
FROM
    #t

正如我之前所述,您遇到困难的原因是您将ChannelId包含在查询中以及其他答案中。如果包含ChannelId,则意味着将有7个以上不同的记录组合。而且,我的原始查询没有返回多于7条记录,它仅返回了7条记录以及该列组合的多少条记录的计数。

我更新了3个示例,其中包括示例数据,我恳请您下次在寻求我们帮助时为他人做这些事情,以便轻松提供DML语句而不是测试用例的图片!

示例1只是将按列分组添加到我的原始查询中,这样您就可以看到我在说什么并且有点疏忽。

示例2是与#1基本相同的区别。

示例3,如果您希望像在其他注释中指定的所有其他数据,则在DBMS支持的情况下,您实际上希望使用窗口函数,但是当然这并不能完美地转换为linq。但是您将需要使用DENSE_RANK()来按所需方式进行分组。

答案 2 :(得分:0)

在查找独特组合时只需使用

select distinct MainID, ItemID, DeviceID,  ChannelID  from Yourtable 

答案 3 :(得分:0)

  

ROW_NUMBER()

可能还有许多其他解决方案。 但是为了加快速度,查询的最佳用途是使用ROW_NUMBER() 示例代码

select
   MainID,
   ItemID,
   DeviceID,
   ChannelID,
   ROW_NUMBER() OVER(ORDER BY MainID,ItemID,DeviceID,ChannelID) as COUNT_VAR
from Your_table;

它比GROUP BY查询要快,因为GROUP BY使用运行时生成的序列号,其中ROW_NUMBER()使用SQL Server定义的默认索引。 希望对您有帮助