2014-11-06 6 views
0

Моя таблица выглядит примерно так:Как суммировать результаты группы строк в столбце?

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

Средний ряд CustomerName является частью группы Row заказанные на CustomerWithErrors, который просто говорит, если имя клиента имеет любой из 4-х ошибок. Если нет, он не отображается в таблице.

В последней общей строке я просто щелкаю правой кнопкой мыши и добавляю итог для каждого столбца в группе строк. Это выводит сумму каждого столбца точно так, как я хочу, за исключением последнего столбца. Когда я добавляю итог, он дает мне сумму полей TotalErrors для всех имен клиентов, а не только те из них, которые имеют ошибки (фактически показаны в таблице). Следовательно, число массивное. Как я могу просто получить сумму чисел, отображаемых в столбце «Общая ошибка»?

EDIT: Вот несколько скриншотов дизайна и режимах просмотра:

Дизайн: http://i.imgur.com/6kEmzw3.png

Preview: http://i.imgur.com/NOpWmAI.png

EDIT 2: SQL ДЛЯ ВЕРХНЕЙ Tablix:

Некоторые из этих был для меня новым, поэтому, вероятно, он выглядит не очень хорошо. Позвольте мне знать, что я могу объяснить. Благодарю.

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 

EDIT 3: 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

Трудно представить, что вы описываете. Можете ли вы опубликовать скриншот? –

+0

У вас есть фильтр на вашем столе, чтобы вытаскивать клиентов только с ошибками или просто группировать их таким образом? Можете ли вы дать нам полное выражение для [sum (totalerrors])? Это может быть ссылка на весь ваш набор данных. – april4181

+0

@TabAlleman Я добавил два скриншота, если вы все еще можете помочь. Вы можете увидеть огромное количество, которое я пытаюсь исправить во втором. –

ответ

1

Из фотографий, которые вы опубликовали, похоже, что ваш набор данных может тянуть все заказы для клиента, а не только с ошибками. Хороший способ проверить это - захватить SQL из вашего набора данных и запустить его в Management Studio. Если вы получаете строки, которые вы не хотите считать, вы можете использовать фильтр на своем табло.

Чтобы применить фильтр на вашем табликсе, щелкните правой кнопкой мыши на нем и перейти к Tablix Свойства: TablixProperties

Нажмите на фильтрах, и вы можете выбрать что-то вроде только заказы, которые имеют флаг ошибки: TablixFilter

Если это не решит вашу проблему, сообщите мне и добавьте SQL для вашего набора данных к вашему вопросу, и мы вернемся к чертежной доске. :)

Edit - 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])) 

Затем в отчете для общих ошибок, использовать выражение, которое говорит Sum (недействительный) + Сумма (неверные данные) + Etc. Пока у вас есть одна запись на одного клиента, ваши данные не должны быть удвоены, и вы все равно можете получить общее количество записей об ошибках.

Я надеюсь, что это поможет. Дайте мне знать, если у вас есть вопросы!

+0

Спасибо, что ответили! Однако у меня все еще такая же проблема. Возможно, это потому, что мой CustomerWithErrors - это не просто флаг, а просто возвращает номер клиента (поэтому я проверяю, является ли оно нулевым, чтобы увидеть, что у клиентов есть ошибки. Так вот что я сделал с фильтром: http: // i .imgur.com/3FHlbry.png И теперь я добавлю sql для первого tablix. –

+0

Извините, я просто получаю возможность снова взглянуть на это. Я никогда раньше не использовал PIVOT./Где я могу поместить его в свой запрос? Теперь я отправлю его. –

Смежные вопросы