SQL查询:按多个列计算相同的记录,但另一列是不同的

时间:2017-08-02 02:44:14

标签: c# sql

我试图用最好的方法来解决这个问题,而且我永远无法达到我想要的结果。

我有一张桌子,这里是它的简化版本,没有无用的物品;请原谅可怜的格式:

表ICD

Pin |Direction | Type    | Specifics | Channel
1   | output    | digital | open/gnd  |   1   
2   | output   | digital | open/gnd  |   2   
3   | output   | digital | open/gnd  |   3   
4   | output   | digital | open/gnd  |   4   
5   | output   | power   | open/gnd  |   5   
6   | output   | power   | open/gnd  |   5   
7   | input    | digital |   gnd     |   null  
8   | input    | digital |   gnd     |   null  
9   | input    | digital |   gnd     |   null  
 10 | input    | digital |   gnd     |   null       
 11 | output   | digital |   open/28     |  6  
 12 | output   | digital |   open/28     |  7  

我想知道 - 计算 - 我有多少种不同类型的信号。这是我用以下查询做的:

SELECT Direction, Type, Specifics, Channel, COUNT(*) AS CountOf
FROM ICDs
GROUP BY Direction, Type, Specifics, Channel
HAVING COUNT(*) > 0

查询结果为:

Direction | Type | Specifics | CountOf
output | digital | open/gnd | 4  
output | power | open/gnd | **2**  
input | digital | gnd | 4  
output | digital | open/28  | 2

此结果的唯一问题是功率输出使用2个引脚(由于高功率)用于同一通道,因此实际上输出功率线应该具有countOf 1而不是2.

output | power | open/gnd | **1**

我尝试做一个子查询并在执行上述查询之前提取所有行,其中Direction,Type,Specifics和Channel为GROUPed,但是这与我的gnd输入的计数混淆,其中没有归因于通道编号。

有任何建议如何调整它以获得所需的结果?我想我应该能够删除重复的通道行,但不能删除那些channel = null然后进行计数的通道行。我无法掌握如何做到这一点。

请注意:表格更大,查询更复杂,但这是我的问题所在。此外,如果重要的话,编码在C#VS2017中完成。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以在子查询中使用DENSE_RANK()

SELECT Direction,Type,Specifics,CountOf=MAX(CountOf)
FROM 
    (
    SELECT *
          ,CountOf = DENSE_RANK() OVER (PARTITION BY Direction,[Type],Specifics ORDER BY isnull(Channel,pin))
    FROM Table1
    ) AS a
GROUP BY Direction,Type,Specifics

SQL Fiddle

当频道为NULL时,请注意isnull(Channel,pin)它使用pin。 它适用于样本数据,但可能不适用于您的实际数据,请根据您的实际数据进行调整。 希望它有所帮助