Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用CountDistinct聚合函数基于表达式对数据分组_Sql Server_Sql Server 2008_Tsql_Reporting Services_Ssrs Grouping - Fatal编程技术网

Sql server 使用CountDistinct聚合函数基于表达式对数据分组

Sql server 使用CountDistinct聚合函数基于表达式对数据分组,sql-server,sql-server-2008,tsql,reporting-services,ssrs-grouping,Sql Server,Sql Server 2008,Tsql,Reporting Services,Ssrs Grouping,我是堆栈溢出和SQL server reporting services的新手。因此,请原谅我的问题格式 因此,情况如下: 我正在开发一份SSRS报告,需要按不同产品名称的计数进行分组,如下所示 我用一个表达式创建了一个名为ProdCount的文本框 COUNTDISTNCT(Fields!Product.value,"DataSet1") 这给了我DataSet1范围内的计数63 现在,我需要通过获取产品名称对数据进行分组,其中上面的公式大于1 我的问题是: 我尝试从计算字段调用ProdC

我是堆栈溢出和SQL server reporting services的新手。因此,请原谅我的问题格式

因此,情况如下:

我正在开发一份SSRS报告,需要按不同产品名称的计数进行分组,如下所示

我用一个表达式创建了一个名为ProdCount的文本框

COUNTDISTNCT(Fields!Product.value,"DataSet1") 
这给了我DataSet1范围内的计数63

现在,我需要通过获取产品名称对数据进行分组,其中上面的公式大于1

我的问题是:

我尝试从计算字段调用ProdCount,因为我 不能在计算字段中使用聚合函数并使用 第二个表达式使用

=报告项目!产品价值

这给了我一个错误FieldValue拒绝ReportItems

我试图通过创建一个计算字段来组合上述两个表达式

IIFCountDistinctFields!Product.Value,数据集1>1,字段!产品,价值,什么都没有 这给了我一个错误,计算字段不能有表达式

我尝试以与上面1相同的方式使用报表变量,但也不起作用

我还尝试在查询中使用交叉连接

选择CountDistinctProduct名称 来自Query1 交叉连接 我的主要查询提供了数据

这需要更多的时间来执行

所以,有谁能帮我解决这个问题,我可以通过组合上述两个表达式来对数据进行分组

请原谅我的格式。我被这个问题弄糊涂了。我接受你所有的编辑,这样我将来可以学习

这是我的密码:

    SELECT * FROM 

--Query1 which counts the number of distinct products) 
(SELECT DISTINCT COUNT(gproduct.ProductName) AS ProdCount
 FROM Table1 
 LEFT JOIN Table4
  ON Table1.column=Table1.column
 LEFT JOIN Table2
  ON Table3.Column = TTable1.Column
 LEFT JOIN
 (
    SELECT Distinct Table6.Name AS ProductName,Table9.ColumnId
    FROM Table6
    INNER JOIN Table7
     ON Table6.Column=Table7.Column
    INNER JOIN Table8
     ON Table7.Column=Table8.Column
    INNER JOIN Table9 
     ON Table9.Column=Table8.Column
 )gproduct
  ON Table1.ColumnId=gproduct.ColumnId
 GROUP BY gproduct.ColumnId,
)qProduct
CROSS JOIN
--My main Query which get data from different table including Product name
(SELECT

       Upper(CASE WHEN (CASE WHEN Table4.Column =1 THEN 'Yes' ELSE 'NO' END)='YES' 
           THEN gab.ProductName
      ELSE
           Table2.productName
      END) AS Product, 
FROM Table1 AS ec
LEFT JOIN Table2 AS ep 
  ON --
LEFT JOIN Table3 AS ebrd
 ON --
Left JOIN Table4 AS etpc
  ON --
LEFT  JOIN Table5 AS gst 
  ON --
LEFT JOIN
( 
 SELECT Distinct Table6.Name AS ProductName,Table9.ColumnId
    FROM Table6
    INNER JOIN Table7
     ON Table6.Column=Table7.Column
    INNER JOIN Table8
     ON Table7.Column=Table8.Column
    INNER JOIN Table9 
     ON Table9.Column=Table8.Column
) gab
ON Table1.ColumnId=gab.ColumnId
)QMain

就我个人而言,我会尝试在查询本身而不是SSRS报告中解决这个问题。根据您提供的数据,可能是:

SELECT
ProductName,
count(distinct Product)
from
YourTable
group by 
ProductName
having count(distinct product) > 1

稍后创建SSRS报告应该很容易

您也可以发布您的SQL查询吗?您正在使用的。glaeran-抱歉,我无法将我的查询作为公司数据共享。这就是为什么我给出了一个基本概念,我的查询看起来像SQL,而不是数据。无论如何,你能把distinct移到SQL中吗?我不能将我的查询作为机密共享。我不能移动,因为如果我在我的主查询中使用上述公式,我得到的计数为1,这是我不想要的。计数的范围适用于完整数据集。正如我所说的,我可以使用交叉连接,但在SQLServer中执行需要更多的时间。然后我们可以想象生成报告需要多少时间;它们应该能满足您的需要,并且可能是迄今为止所提到的选项中性能最好的解决方案。如果可以的话,我还建议发布您的查询-如果您关心敏感信息字段/表名?,只需更改这些单词即可。如果您的公司政策使您无法与同事共享经过清理的代码片段,那么您在该公司的未来将非常艰难。我刚刚对查询1做了同样的事情,但仍然需要将其与主查询交叉连接以获得所需的计数。产品名称取自两个表,当第一个表中的产品名称为null时,使用case语句,然后取自第二个表。我们能用case语句来表示count表达式吗?。我尝试了您的查询,但没有给出所需的计数值。它给出了每行的计数。您可以用CASE函数替换上述查询中的ProductName。尽量避免使用交叉联接,只是将表内部联接并给它另一个别名不是很简单吗?
SELECT
ProductName,
count(distinct Product)
from
YourTable
group by 
ProductName
having count(distinct product) > 1