Sql server 使用CountDistinct聚合函数基于表达式对数据分组
我是堆栈溢出和SQL server reporting services的新手。因此,请原谅我的问题格式 因此,情况如下: 我正在开发一份SSRS报告,需要按不同产品名称的计数进行分组,如下所示 我用一个表达式创建了一个名为ProdCount的文本框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
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