2015-01-02 4 views
-1

Можно ли комбинировать строки со связанными данными, в следующем примере это будет ясно. Я использую этот скрипт:SQL Sever 2008 - Как объединить строки со связанными данными

SELECT AlertName, COUNT(AlertName) as NumAlerts 
FROM Alerts 
GROUP BY AlertName 
ORDER BY AlertName 

И результаты есть:

AlertName    NumAlets 
------------------------|--------------- 
... 
Windows Services SQL  9 
... 
Windows Services - Core 7 
Windows Services Core 271 
Windows Services: Core 90 
... 

Но я хотел бы объединить (группа) эти строки и обобщать NumAlets, чтобы получить этот результат:

AlertName    NumAlets 
------------------------|--------------- 
... 
Windows Services SQL  9 
Windows Services (Core) 368 
... 

Как я могу это сделать?

Спасибо заранее!

ответ

0
SELECT rs.AlertName, COUNT(1) Totals 
FROM (
    SELECT CASE 
     WHEN AlertName LIKE 'Windows Services%Core' 
      THEN 'Windows Services (Core)' 
     WHEN AlertName LIKE 'Windows Services%SQL' 
      THEN 'Windows Services (SQL)' 
     ELSE AlertName END AlertName 
    from ALERTS) RS 
Group By rs.AlertName 
4

Вам нужен стол, чтобы перевести различные варианты написания в одно:

DECLARE @Translation TABLE (
    AlertName varchar(100), 
    CommonAlertName varchar(100) 
) 

INSERT INTO @Translation (AlertName, CommonAlertName) 
    VALUES ('Windows Services SQL', 'Windows Services SQL'), 
      ('Windows Services - Core', 'Windows Services (Core)'), 
      ('Windows Services Core', 'Windows Services (Core)'), 
      ('Windows Services: Core', 'Windows Services (Core)') 

SELECT T.CommonAlertName, SUM(A.NumAlerts) AS NumAlerts 
FROM Alerts A 
INNER JOIN @Translation T ON A.AlertName = T.AlertName 
GROUP BY T.CommonAlertName 
+0

это только показывает, сгруппированных строк анс пропускает все остальное :(Но если вы используете 'ЛЕВЫЙ JOIN' вместо этого он отображает сгруппированные одни и' NULL' для всех остальных! Как сделать его отображения сгруппированных строк со всеми остальными строками? –

+0

Это указатель. Остальное зависит от вас, чтобы оно соответствовало вашим требованиям. SO не является бесплатной службой написания кода. –

1

ответ ZOFF»является разумным, но логика должна быть left join поэтому перевод не должен существовать в таблице перевода:

with translation as (
     select 'Windows Services SQL' as AlertName, 'Windows Services SQL' as CommonAlertName union ll 
     select 'Windows Services - Core', 'Windows Services (Core)' union all 
     select 'Windows Services Core', 'Windows Services (Core)' union all 
     select 'Windows Services: Core', 'Windows Services (Core)' 
    ) 
SELECT COALESCE(T.CommonAlertName, A.AlertName), SUM(A.NumAlerts) AS NumAlerts 
FROM Alerts A LEFT JOIN 
    Translation T 
    ON A.AlertName = T.AlertName 
GROUP BY COALESCE(T.CommonAlertName, A.AlertName); 
1

Вы также можете выполнить это с помощью функции, которая отфильтровывает все не буквенно-цифровые символы, чтобы строки, такие как «Службы Windows - Core» и «Службы Windows (Core)», стали «WindowsServicesCore» и совпадали друг с другом.

Следующая функция приходит от http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-to-parse-alphanumeric-characters-from-string/

CREATE FUNCTION dbo.UDF_ParseAlphaChars 
(
@string VARCHAR(8000) 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    DECLARE @IncorrectCharLoc SMALLINT 
    SET @IncorrectCharLoc = PATINDEX('%[^0-9A-Za-z]%', @string) 

    WHILE @IncorrectCharLoc > 0 
    BEGIN 
     SET @string = STUFF(@string, @IncorrectCharLoc, 1, '') 
     SET @IncorrectCharLoc = PATINDEX('%[^0-9A-Za-z]%', @string) 
    END 

    SET @string = @string 
    RETURN @string 
END 

и запрос выглядит как на картинке ниже.

select min(AlertName) as AlertName, COUNT(*) as NumAlerts 
from Alerts 
group by dbo.UDF_ParseAlphaChars(AlertName) 
Смежные вопросы