Sql server 计数唯一列,但返回重复的列
我有三个表,其中一个映射其他两个,我的查询通过引用表(C)返回一个表(a)列表和多个表(B) 我的问题Sql server 计数唯一列,但返回重复的列,sql-server,Sql Server,我有三个表,其中一个映射其他两个,我的查询通过引用表(C)返回一个表(a)列表和多个表(B) 我的问题 SELECT a.A_ID, a.DESC, b.B_ID, b.NAME, COUNT(*) OVER() AS TOTAL FROM table_A a LEFT JOIN table_C c ON c.A_ID = a.A_ID LEFT JOIN table_B b on b.B_ID = c.B_ID 表A: A_ID | DESC 10001 | Sample 10
SELECT a.A_ID, a.DESC, b.B_ID, b.NAME, COUNT(*) OVER() AS TOTAL
FROM table_A a
LEFT JOIN table_C c ON c.A_ID = a.A_ID
LEFT JOIN table_B b on b.B_ID = c.B_ID
表A:
A_ID | DESC
10001 | Sample
10002 | Sample
10003 | Sample
表B:
B_ID | NAME
10001 | Name 1
10002 | Name 2
表C:
C_ID | A_ID | B_ID
10001 | 10001 | 10001
10002 | 10001 | 10002
10003 | 10002 | 10001
查询返回我想要的数据,但我的总数也会计算重复的数据
| A_ID | A_DESC | B_ID | B_NAME | TOTAL
1 | 10001 | Sample | 10001 | Name_1 | 4
2 | 10001 | Sample | 10002 | Name_2 | 4
3 | 10002 | Sample | 10001 | Name_1 | 4
4 | 10003 | Sample | NULL | NULL | 4
它能计算出重复的数量,我也知道能计算得很好。。计数。我在这方面遇到了问题,因为我的场景需要上面的所有数据,但计数正确(不计算重复项,但返回重复项)
这是我想要的回报
| A_ID | A_DESC | B_ID | B_NAME | TOTAL
1 | 10001 | Sample | 10001 | Name_1 | 3
2 | 10001 | Sample | 10002 | Name_2 | 3
3 | 10002 | Sample | 10001 | Name_1 | 3
4 | 10003 | Sample | NULL | NULL | 3
我对sql还是新手,我在网站stackoverflow.com上搜索过这个,但大多数文章都删除了重复的内容 通过使用两个
densite\u RANK()
函数,您可以执行()上的COUNT(DISTINCT Col)的等效操作:
DECLARE @A TABLE (A_ID INT, [Desc] VARCHAR(255));
DECLARE @B TABLE (B_ID INT, Name VARCHAR(255));
DECLARE @C TABLE (C_ID INT, A_ID INT, B_ID INT);
INSERT @A VALUES (10001, 'Sample'), (10002, 'Sample'), (10003, 'Sample');
INSERT @B VALUES (10001, 'Name 1'), (10002, 'Name 2');
INSERT @C VALUES (10001, 10001, 10001), (10002, 10001, 10002), (10003, 10002, 10001);
SELECT a.A_ID, a.[DESC], b.B_ID, b.NAME, COUNT(*) OVER() AS TOTAL,
DenseRankAsc = DENSE_RANK() OVER(ORDER BY a.A_ID ASC),
DenseRankDesc = DENSE_RANK() OVER(ORDER BY a.A_ID DESC),
CountDistinct = DENSE_RANK() OVER(ORDER BY a.A_ID ASC)
+ DENSE_RANK() OVER(ORDER BY a.A_ID DESC) - 1
FROM @A a
LEFT JOIN @C c ON c.A_ID = a.A_ID
LEFT JOIN @B b on b.B_ID = c.B_ID;
这给
A_ID DESC B_ID NAME TOTAL DenseRankAsc DenseRankDesc CountDistinct
-------------------------------------------------------------------------------------------
10003 Sample NULL NULL 4 3 1 3
10002 Sample 10001 Name 1 4 2 2 3
10001 Sample 10001 Name 1 4 1 3 3
10001 Sample 10002 Name 2 4 1 3 3
前提是,通过对升序和降序进行排序,可以确定唯一项的总数
也就是说,一个更简单的解决方案可能是在您知道结果已经不同的时候进行计数,例如:
DECLARE @A TABLE (A_ID INT, [Desc] VARCHAR(255));
DECLARE @B TABLE (B_ID INT, Name VARCHAR(255));
DECLARE @C TABLE (C_ID INT, A_ID INT, B_ID INT);
INSERT @A VALUES (10001, 'Sample'), (10002, 'Sample'), (10003, 'Sample');
INSERT @B VALUES (10001, 'Name 1'), (10002, 'Name 2');
INSERT @C VALUES (10001, 10001, 10001), (10002, 10001, 10002), (10003, 10002, 10001);
SELECT a.A_ID, a.[DESC], b.B_ID, b.NAME, a.TOTAL
FROM (SELECT *, COUNT(*) OVER() AS Total FROM @A) a
LEFT JOIN @C c ON c.A_ID = a.A_ID
LEFT JOIN @B b on b.B_ID = c.B_ID;
通过使用两个densite\u RANK()
函数,您可以执行()上的COUNT(DISTINCT Col)的等效操作:
DECLARE @A TABLE (A_ID INT, [Desc] VARCHAR(255));
DECLARE @B TABLE (B_ID INT, Name VARCHAR(255));
DECLARE @C TABLE (C_ID INT, A_ID INT, B_ID INT);
INSERT @A VALUES (10001, 'Sample'), (10002, 'Sample'), (10003, 'Sample');
INSERT @B VALUES (10001, 'Name 1'), (10002, 'Name 2');
INSERT @C VALUES (10001, 10001, 10001), (10002, 10001, 10002), (10003, 10002, 10001);
SELECT a.A_ID, a.[DESC], b.B_ID, b.NAME, COUNT(*) OVER() AS TOTAL,
DenseRankAsc = DENSE_RANK() OVER(ORDER BY a.A_ID ASC),
DenseRankDesc = DENSE_RANK() OVER(ORDER BY a.A_ID DESC),
CountDistinct = DENSE_RANK() OVER(ORDER BY a.A_ID ASC)
+ DENSE_RANK() OVER(ORDER BY a.A_ID DESC) - 1
FROM @A a
LEFT JOIN @C c ON c.A_ID = a.A_ID
LEFT JOIN @B b on b.B_ID = c.B_ID;
这给
A_ID DESC B_ID NAME TOTAL DenseRankAsc DenseRankDesc CountDistinct
-------------------------------------------------------------------------------------------
10003 Sample NULL NULL 4 3 1 3
10002 Sample 10001 Name 1 4 2 2 3
10001 Sample 10001 Name 1 4 1 3 3
10001 Sample 10002 Name 2 4 1 3 3
前提是,通过对升序和降序进行排序,可以确定唯一项的总数
也就是说,一个更简单的解决方案可能是在您知道结果已经不同的时候进行计数,例如:
DECLARE @A TABLE (A_ID INT, [Desc] VARCHAR(255));
DECLARE @B TABLE (B_ID INT, Name VARCHAR(255));
DECLARE @C TABLE (C_ID INT, A_ID INT, B_ID INT);
INSERT @A VALUES (10001, 'Sample'), (10002, 'Sample'), (10003, 'Sample');
INSERT @B VALUES (10001, 'Name 1'), (10002, 'Name 2');
INSERT @C VALUES (10001, 10001, 10001), (10002, 10001, 10002), (10003, 10002, 10001);
SELECT a.A_ID, a.[DESC], b.B_ID, b.NAME, a.TOTAL
FROM (SELECT *, COUNT(*) OVER() AS Total FROM @A) a
LEFT JOIN @C c ON c.A_ID = a.A_ID
LEFT JOIN @B b on b.B_ID = c.B_ID;
我不清楚您是如何定义重复的,因为所有4行都不同,并且所有列都有一个值在多行中重复。。。您想要的结果是3,因为A_ID
有3个唯一值,还是3,因为B_ID
有3个非空记录?您看过计数(不同的…
)的任何示例吗?@GarethD抱歉,我的错了,重复,因为一个值只有3个唯一值_ID@TabAlleman我已经尝试了distinct,我不明白,但它只给了我(1)作为总计,我使用计数(distinct a.a_ID)。我不清楚您是如何定义一个副本的,因为所有4行都是不同的,所有列都有一个值在多行中重复。。。您想要的结果是3,因为A_ID
有3个唯一值,还是3,因为B_ID
有3个非空记录?您看过计数(不同的…
)的任何示例吗?@GarethD抱歉,我的错了,重复,因为一个值只有3个唯一值_ID@TabAlleman我尝试了distinct,我不明白,但它只给我(1)作为总数,我使用计数(distinct a.a_ID)谢谢!这正是我需要的!我一整天都在挠头!谢谢这正是我需要的!我一整天都在挠头!