Группируйте, не группируя, как ожидалось, в поле, извлеченном из строки

#sql #group-by

Вопрос:

Я не могу заставить Группу вести себя должным образом, но я не уверен, чего мне не хватает.

Я полагаю, что Итемпат-это моя проблема. Когда я использую Group By, это группировка по пути, который может отличаться по длине и содержанию, даже если имя отчета в конце пути одно и то же. Мне нужно, чтобы они были сгруппированы по имени отчета, а не по фактическому пути. Я не уверен, чего мне не хватает, чтобы это произошло. Вы можете увидеть результаты моего кода ниже. Они должны быть сгруппированы по названию, но это не так, потому что ItemPath может отличаться, поэтому совпадают только некоторые из них.

Я попытался создать производную таблицу и сгруппировать по столбцу ReportName, но это дало тот же результат, так как мне пришлось включить ItemPath в предложение group by из-за того, что он не был агрегирован в инструкции SELECT.

 SELECT Count(ItemPath) AS ExecutionCount, 
        RIGHT(ItemPath, CHARINDEX('/', REVERSE([ItemPath]), 0) - 1) AS ReportName, 
        SUM([TimeDataRetrieval]) AS TimeDataRetrievalSum, 
        SUM([TimeProcessing]) AS TimeProcessingSum, 
        SUM([ByteCount]) AS ByteCountSum, 
        SUM([RowCount]) AS RowCountSum
 FROM [ReportServer].[dbo].[ExecutionLog3]
 WHERE ItemPath LIKE '%/example/%' AND 
       ItemPath NOT LIKE '%placeholder%' AND 
       ItemPath NOT LIKE '%example2%'
GROUP BY ItemPath
ORDER BY ExecutionCount DESC
 

Образец текущих результатов («Счет» должен быть сгруппирован, но это не так):

 | ExecutionCount | ReportName |TimeDataRetrievalSum|
| -------------- | ---------- |--------------------|
| 1246           | Invoice    |82303               |
| 41             | Invoice    |6303                |
| 8              |Remittance  |153                 |
 

Спасибо!

Комментарии:

1. просто сгруппируйте по : СПРАВА(ItemPath, CHARINDEX(‘/’, ОБРАТНЫЙ([ItemPath]), 0) — 1)

2. У вас есть два отчета с Invoice именами в разных путях

3. @Adamszsz Вау, я знал, что это будет что-то простое, о чем я не думал. Спасибо! Это сработало.

4. Приятно это слышать 🙂 , пожалуйста, проголосуйте за одежду по вопросу, если это вам поможет.

Ответ №1:

Тебе нужно что-то вроде этого :

 SELECT Count(ItemPath) AS ExecutionCount, 
        RIGHT(ItemPath, CHARINDEX('/', REVERSE([ItemPath]), 0) - 1) AS ReportName, 
        SUM([TimeDataRetrieval]) AS TimeDataRetrievalSum, 
        SUM([TimeProcessing]) AS TimeProcessingSum, 
        SUM([ByteCount]) AS ByteCountSum, 
        SUM([RowCount]) AS RowCountSum
 FROM [ReportServer].[dbo].[ExecutionLog3]
 WHERE ItemPath LIKE '%/example/%' AND 
       ItemPath NOT LIKE '%placeholder%' AND 
       ItemPath NOT LIKE '%example2%'
GROUP BY RIGHT(ItemPath, CHARINDEX('/', REVERSE([ItemPath])
ORDER BY ExecutionCount DESC