需要COUNT的帮助,获得意想不到的结果

时间:2017-02-13 21:43:34

标签: sql-server reporting-services count

我必须加入十几个表格才能获得SSRS报告所需的特定字段。其中一个必要的表连接也会添加“重复”记录。

就DB而言,记录当然不是重复的,因为一个字段使它们成为唯一的。所以我创建了一个关于我的主查询的tmp表,并没有包含那个邪恶的字段(我将配音D列) - 这个查询让我知道了结。

我相信这会让我的任务变得简单。

我的临时表现在只有以下(匿名):

    SELECT DISTINCT
    jt.A                        [ColumnA]
    ,jt.B                       [ColumnB]
    ,jt.C                       [ColumnC]
    ,COUNT(*)                   [TotalCount]
INTO
    #CountsTbl
FROM
    #JoinsTbl jt    
GROUP BY
    jt.A    
    ,jt.B                           
    ,jt.C

当我将此表与另一个表连接以查看结果时,Count仍然是错误的,即使D列未包含在tmp表中且我使用了D,但是A,B,C中具有相同数据的任何记录都是重复的选择DISTINCT。

+---------+------------+------------+---------+------------+
| ColumnA |  ColumnB   |  ColumnC   | ColumnD | TotalCount |
+---------+------------+------------+---------+------------+
| 0123    | 01/01/2016 | 01/31/2016 |   ABC   |     1      |
+---------+------------+------------+---------+------------+
| 0123    | 02/01/2016 | 02/28/2016 |   ABC   |     2      |
+---------+------------+------------+---------+------------+
| 0123    | 02/01/2016 | 02/28/2016 |   XYZ   |     2      |
+---------+------------+------------+---------+------------+

我缺少的逻辑是逃避我,我一直在研究这个问题,我想我还需要其他一些眼睛来看待它。在上面的例子中,这是我加入时得到的,即使COUNT已经在前面的tmp表中完成了。第一行有正确的计数,第二行和第三行我只想计数为1,因为我不希望COUNT看D列,只是A-C。

我正在使用SQL Server 2014

这是我的第一篇文章,如果我需要提供更多信息,请告诉我。我没有成功找到有意义的答案 - 也许我在问错误的问题。

由于

2 个答案:

答案 0 :(得分:0)

我知道这可能不是非常有用,因为我没有时间详细讨论查询等等 - 但我确实找到了自己解决问题的方法。

我的主要tmp表(我没有在这里发布)有许多复杂的连接 - (需要清理以提高性能),然后是几个连接到聚合的tmp表。这3个tmp表连接到我的主查询,以显示我需要的SSRS报告结果。有8个用户参数,3个是可选的,但报告的字段是固定的,导致我的大部分头痛。

我最终做的是删除' ColumnD'从第一个大型tmp表中执行该表上的SELECT DISTINCT。

下一个tmp表是我在我的问题中模拟的那个。我能够得到准确的'经过上述变更后的计数。我使用引号因为所有的COUNTS都是1,因为ColumnB和C是日期,它们使每一行都是唯一的。毋庸置疑,这是朝着正确方向迈出的一步。

我删除了日期字段(我把它们放在那里只是为了能够看到我是否得到了重复项)并从上面的tmp表中加入了2个表中的2个表中的键,下面是模拟的它是如何工作的:

SELECT
    jt.FKEY1                            [AccountKEY]
    ,jt.FKEY2                           [CodeKEY]
    ,COUNT(*)                           [TotalCount]
--INTO
--  #CountsTbl
FROM
    #JoinsTbl jt    
GROUP BY GROUPING SETS
    (jt.AccountKEY) 
    ,(jt.CodeKEY)
ORDER BY
    jt.CodeKEY
    ,jt.AccountKEY

生成的tmp表有我需要的COUNT。

感谢那些提出问题的人 - 特别感谢我阅读的许多匿名其他帖子,以帮助他们研究此查询

答案 1 :(得分:0)

您在第2行和第3行中排名第2,因为这是ABC的值为0123 | 02/01/2016 | 02/28/2016的行数

为避免这个问题,您有两种选择:

  1. 在计数查询包含列D中,您将始终拥有1(除非所有4列都重复。)
  2. 在查询中,生成结果,您完全排除列D,或使用MIN / MAX等聚合。
  3. BTW两种情况都可能不正确。这取决于你想要实现的目标。