2014-11-06 28 views
0

我的表看起来像:如何在一列中总计行组的结果?

Customer   Error1   Error2   Error3   Error4  TotalErrors  TotalOrders 
CustomerName [SUM(Error1)] [SUM(Error2)] [SUM(Error3)] [SUM(Error3) [SUM(TotalErrors)] [TotalOrders] 
Total 

的中间行客户名称是行集团的一部分下令CustomerWithErrors简单地告知用户,如果给定的客户名称有任何的4个错误的。如果没有,它不会显示在表格中。

在最后一行中,我只需右键单击并为行组中的每列添加总计。这完全按照我的意愿输出每列的总和,除了最后一列。当我添加总数时,它给了我所有客户名称的TotalErrors字段的总和,而不仅仅是那些有错误的字段(表中实际显示的字段)。因此,这个数字非常庞大。我怎样才能得到总错误列中显示的数字总和?

编辑:下面是设计和预览模式一些截图:

设计:http://i.imgur.com/6kEmzw3.png

前瞻:http://i.imgur.com/NOpWmAI.png

编辑2:SQL的顶级表矩阵:

一些这对我来说是新的,所以它可能看起来不太好。让我知道我能解释什么。谢谢。

SELECT 
     PKEY 
     ,Customer 
     ,isnull(CustomerName, 'Unknown') AS CustomerName 
     ,CustomerWithErrors 
     ,Warehouse 
     ,ErrorMessage 
     ,PROCESSDATE 
     ,CARTONERRORMESSAGE 
     ,Division 
     ,BOLNO 
     ,BOLSHIPDATE 
     ,CARTONDETAILERRMSG 
     ,ErrorCategory 
     ,CASE WHEN ErrorCategory='Success' 
     THEN 0 
     ELSE  
     COUNT(NotLate) 
     END AS OnTimeCount 
     ,COUNT(Invalid) AS InvalidCount 
     ,COUNT(WrongData) AS WrongDataCount 
     ,COUNT(Duplicate) AS DuplicateCount 
     ,COUNT(MissingData) AS MissingDataCount 
     ,(COUNT(Invalid)+COUNT(WrongData)+COUNT(Duplicate)+COUNT(MissingData)) AS TotalErrors 
     ,Total945s AS TotalReport945s 
     --,COUNT(*) OVER(PARTITION BY [CustomerWithErrors]) Total945s 
     , (SELECT (Total945s) WHERE CustomerWithErrors>=0) AS TotalErrors 

     FROM(

    SELECT 
     PKEY 
     ,Customer 
     ,CASE WHEN CustomerName = '' OR CustomerName IS NULL 
     THEN 'Unknown' 
     ELSE CustomerName 
     END AS CustomerName 
     ,CASE WHEN CustomerName='' OR CustomerName IS NULL OR CustomerName='Unknown' 
     THEN 0 
     ELSE 
     (SELECT DISTINCT Customer WHERE ErrorCategory <> 'Success') END 
     AS CustomerWithErrors 
     ,Warehouse 
     ,ErrorMessage 
     ,PROCESSDATE 
     ,CARTONERRORMESSAGE 
     ,Division 
     ,BOLNO 
     ,BOLSHIPDATE 
     ,CARTONDETAILERRMSG 
     ,ErrorCategory 
     ,CASE WHEN ErrorCategory='Success' 
     THEN 'N' 
     ELSE OnTime   
     END AS OnTime 
     ,(SELECT Customer WHERE OnTime = 'Y') AS NotLate 
     ,(SELECT Customer WHERE ErrorCategory = 'Invalid') AS Invalid 
     ,(SELECT Customer WHERE ErrorCategory = 'Wrong Data') AS WrongData 
     ,(SELECT Customer WHERE ErrorCategory = 'Duplicate') AS Duplicate 
     ,(SELECT Customer WHERE ErrorCategory = 'Missing Data') AS MissingData 
     , COUNT(*) OVER(PARTITION BY [Customer]) Total945s 



    FROM EDI945UTIErrors 


    ) S 


     GROUP BY 
     PKEY 
     ,Customer 
     ,CustomerName 
     ,CustomerWithErrors 
     ,Warehouse 
     ,ErrorMessage 
     ,PROCESSDATE 
     ,CARTONERRORMESSAGE 
     ,Division 
     ,BOLNO 
     ,BOLSHIPDATE 
     ,CARTONDETAILERRMSG 
     ,ErrorCategory 
     ,OnTime 
     ,Total945s 

编辑3: 这是否看起来像我应该在报告中聚集做什么:与PIVOT SQL?谢谢。

SELECT 
     S.PKEY 
     ,Customer 
     ,isnull(S.CustomerName, 'Unknown') AS CustomerName 
     ,CustomerWithErrors 
     ,Warehouse 
     ,ErrorMessage 
     ,PROCESSDATE 
     ,CARTONERRORMESSAGE 
     ,Division 
     ,BOLNO 
     ,BOLSHIPDATE 
     ,CARTONDETAILERRMSG 
     ,ErrorCategory 
     ,CASE WHEN ErrorCategory='Success' 
     THEN 0 
     ELSE  
     COUNT(NotLate) 
     END AS OnTimeCount 
     ,Invalid 
     ,WrongData 
     ,Duplicate 
     ,MissingData 
     --,COUNT(Invalid) AS InvalidCount 
     --,COUNT(WrongData) AS WrongDataCount 
     --,COUNT(Duplicate) AS DuplicateCount 
     --,COUNT(MissingData) AS MissingDataCount 
     --,(COUNT(Invalid)+COUNT(WrongData)+COUNT(Duplicate)+COUNT(MissingData)) AS TotalErrors 
     ,Total945s AS TotalReport945s 

     --,COUNT(*) OVER(PARTITION BY [CustomerWithErrors]) Total945s 
     --, (SELECT (Total945s) WHERE CustomerWithErrors>=0) AS TotalErrors 

     FROM(

    SELECT 
     PKEY 
     ,Customer 
     ,CASE WHEN CustomerName = '' OR CustomerName IS NULL 
     THEN 'Unknown' 
     ELSE CustomerName 
     END AS CustomerName 
     ,CASE WHEN CustomerName='' OR CustomerName IS NULL OR CustomerName='Unknown' 
     THEN 0 
     ELSE 
     (SELECT DISTINCT Customer WHERE ErrorCategory <> 'Success') END 
     AS CustomerWithErrors 
     ,Warehouse 
     ,ErrorMessage 
     ,PROCESSDATE 
     ,CARTONERRORMESSAGE 
     ,Division 
     ,BOLNO 
     ,BOLSHIPDATE 
     ,CARTONDETAILERRMSG 
     ,ErrorCategory 
     ,CASE WHEN ErrorCategory='Success' 
     THEN 'N' 
     ELSE OnTime   
     END AS OnTime 
     ,(SELECT Customer WHERE OnTime = 'Y') AS NotLate 
     --,(SELECT Customer WHERE ErrorCategory = 'Invalid') AS Invalid 
     --,(SELECT Customer WHERE ErrorCategory = 'Wrong Data') AS WrongData 
     --,(SELECT Customer WHERE ErrorCategory = 'Duplicate') AS Duplicate 
     --,(SELECT Customer WHERE ErrorCategory = 'Missing Data') AS MissingData 
     , COUNT(*) OVER(PARTITION BY [Customer]) Total945s 



    FROM EDI945UTIErrors 
    --WHERE Customer ='104646' and OnTime = 'Y' 
    --WHERE CUSTOMER='107834' 
    --AND ErrorCategory = 'Wrong Data' 
    --AND ERRORMESSAGE LIKE '%Overshipment Not Allowed%' 

    ) S 
    LEFT JOIN 
    (
    SELECT PKEY, ISNULL(CustomerName, 'Unknown') AS CustomerName, [Invalid], [WrongData], [Duplicate], [MissingData], [Success] 
FROM EDI945UTIErrors 
PIVOT (Count(Customer) FOR ErrorCategory in ([Invalid], [WrongData], [Duplicate], [MissingData], [Success])) 
AS P) AS PT ON S.PKEY = PT.PKEY 

     GROUP BY 
     S.PKEY 
     ,Customer 
     ,S.CustomerName 
     ,CustomerWithErrors 
     ,Warehouse 
     ,ErrorMessage 
     ,PROCESSDATE 
     ,CARTONERRORMESSAGE 
     ,Division 
     ,BOLNO 
     ,BOLSHIPDATE 
     ,CARTONDETAILERRMSG 
     ,ErrorCategory 
     ,OnTime 
     ,Total945s 
     ,Invalid 
     ,WrongData 
     ,MissingData 
     ,Duplicate 

非常感谢您的宝贵时间。

+0

很难描绘你所描述的内容。你可以张贴截图吗? – 2014-11-06 20:00:35

+0

你的桌子上是否有过滤器来吸引有错误的顾客,还是仅仅将它们分组?你能给我们[sum(totalerrors))的完整表达吗?它可能指的是你的整个数据集。 – april4181 2014-11-06 20:06:39

+0

@TabAlleman如果你仍然可以帮忙,我添加了两个截图。你可以看到我试图解决的第二个问题。 – 2014-11-10 14:09:25

回答

1

从发布的图片看,您的数据集可能会吸引所有客户的订单,而不仅仅是那些有错误的订单。检查这一点的一个好方法是从数据集中获取SQL并在Management Studio中运行它。如果您获取的是不想计数的行,则可以在Tablix上使用过滤器。

要在Tablix中应用过滤器,右击它并转到Tablix属性: TablixProperties

点击过滤器,你可以选择像只具有一个错误标志命令: TablixFilter

如果这不能解决您的问题,请让我知道并将您的数据集的SQL添加到您的问题中,然后我们将返回到绘图板。 :)

编辑 - 11/12/2014

感谢您的SQL!如果CustomerWithErrors仅返回客户编号,那么过滤器将无济于事。你仍然在拉每个记录(甚至那些ErrorCategory ='成功')。你知道你有两列别名为TotalErrors吗?有

(COUNT(Invalid)+COUNT(WrongData)+COUNT(Duplicate)+COUNT(MissingData)) AS TotalErrors 

(SELECT (Total945s) WHERE CustomerWithErrors>=0) AS TotalErrors 

第一个看起来像它可能工作,但我不知道你正在使用你的表,。另一个需要思考的问题是,你正在计算聚合总量。你可能最终相乘他们,如果你遇到,你有这样的结果集中的情况:

Customer | ErrorCategory | TotalErrors 
1234  | Invalid   | 2 
1234  | Duplicate  | 2 

结果,你会在您的报告中看到:

Customer | TotalErrors 
1234  | 4 

如果你想避免,你可以让SSRS进行汇总。你有没有考虑过做一个PIVOT? 你可以做这样的事情:

Select Customer, ISNULL(CustomerName, 'Unknown'), [Invalid], [Wrong Data], [Duplicate], [Missing Data], [Success] 
FROM EDITable 
PIVOT (Count(Customer) FOR ErrorCategory in ([Invalid], [Wrong Data], [Duplicate], [Missing Data], [Success])) 

然后在你的总错误报告,使用显示总和(无效)+总和(错误的数据)+等的表达。只要每个客户有一个记录,您的数据就不会翻倍,您仍然可以获得非错误记录的总数。

我希望帮助。让我知道你是否有疑问!

+0

非常感谢您的回复!但是我仍然有同样的问题。也许这是因为我的CustomerWithErrors不仅仅是一个标志,而是简单地返回客户编号(所以我检查它是否为null,以查看哪些客户有错误 所以,这里是我用过滤器做的:http://我.imgur.com/3FHlbry.png 现在,我将为第一个tablix添加sql。 – 2014-11-11 22:24:46

+0

对不起,我现在才有机会再次看看这个。我以前从来没有真正使用过PIVOT。 /我在哪里可以找到我的查询?我现在就google了。 – 2014-11-13 21:17:03