2015-09-10 16 views
-2

Я использую SQL Server 2008, и у меня есть большая база данных, мне нужно подсчитать данные для каждой манзаны, но каждая строка равна 0, поэтому я не знаю, как это сделатьПодсчет данных с использованием SQL Server 2008

SELECT 
    Manzana, 
    SUM(CASE WHEN Manzana IN('CBrc','CBrc1', 'CBrc2') THEN 1 ELSE 0 END)AS CBrc, 
    SUM(CASE WHEN Manzana IN ('W1','W11','W12','W13','W14','W15','W16') THEN 1 ELSE 0 END) AS W1, 
    SUM(CASE WHEN Manzana IN('PC1','PC11') THEN 1 ELSE 0 END) AS PC1, 
    SUM(CASE WHEN Manzana IN ('CLu','CLU1') THEN 1 ELSE 0 END) AS CLu, 
    SUM(CASE WHEN Manzana IN('S3','S31') THEN 1 ELSE 0 END) AS S3, 
    SUM(CASE WHEN Manzana IN ('C2L') THEN 1 ELSE 0 END) AS C2L, 
    SUM(CASE WHEN Manzana IN ('PCA') THEN 1 ELSE 0 END) AS PCA, 
    SUM(CASE WHEN Manzana IN ('ADO') THEN 1 ELSE 0 END) AS AD, 
    SUM(CASE WHEN Manzana IN ('PRC') THEN 1 ELSE 0 END) AS CBu, 
    SUM(CASE WHEN Manzana IN('SIN') THEN 1 ELSE 0 END) AS SIN_ACCESO_A_INFORMACION 
FROM 
    dbo.Hoja3$ 
GROUP BY 
    Manzana 

мне нужно, чтобы получить что-то вроде этого

Manzana CBrc W1 PC1 CLU S3 C2L 
5445  8 11 0 0 0 0 
4545  15 0 30 0 0 0 
5455  21 0 5 3 2 0 
7893  0 0 3 1 0 0 
1566  100 4 1 0 0 80 
+0

вам нужно 'COUNT', если вы хотите считать данные, возвращаемые запросом –

+0

я стараюсь подсчитайте количество Cbrc, Pc1, Clu и т. д. У меня в каждой Manzana –

ответ

0

После прочтения вашего комментария «Я пытаюсь подсчитать, сколько ККБД ПК1, Кл и т.д. у меня есть в каждом Манзана» Я вижу проблему.

Неправильно используется оператор IN.

Чтобы проверить Ф.О. появление подстроки использовать CHARINDEX функцию:

SELECT 
    Manzana, 
    SUM(CASE WHEN CHARINDEX('SIN', Manzana) > 0 THEN 1 ELSE 0 END) AS SIN, 
    SUM(CASE WHEN CHARINDEX('PCA', Manzana) > 0 THEN 1 ELSE 0 END) AS PCA, 
    ... 
FROM 
    Hoja3$ 
GROUP BY 
    Manzana 
+0

Я пробовал с вашим кодом, но получил ошибку Msg 156, Level 15, State 1, Line 2 Неверный синтаксис рядом с ключевым словом «WHERE». –

+0

Должно быть «КОГДА». Я исправил его :) – Marusyk

+0

тот же результат, что и я, каждая строка с 0 –

0

Вы не можете группировать по Manzanaи не группе Manzana. Кроме того, из данных примера я могу сказать, что вы не предоставили достаточную информацию. Просто с первого ряда:

Manzana CBrc W1 PC1 CLU S3 C2L 
5445  8 11 0 0 0 0 

Если Manzana является 5445, то, что столбец имеет значение CBrc? Это не может быть столбец Manzana, но должен быть другой столбец. В этом вакууме информации я собираюсь назвать тайную колонку Code.

Тогда попробуйте это (конечно, вы должны поместить все кодовые группы в):

WITH CodeGroupings AS (
    SELECT * FROM (VALUES -- Do this in a permanent table instead! 
     ('CBrc%', 'CBrc'), -- can use wildcards 
     ('W1_', 'W1'), -- or single letter wildcards 
     ('PC1', 'PC1'), -- or just put individual values 
     ('PC11', 'PC1'), -- mapping to the same group as the previous line 
     ('SIN', 'SIN_ACCESO_A_INFORMACION') 
    ) M (CodePattern, CodeGroup) 
), ManzanaCodeGroups AS (
    SELECT 
     H.Manzana, 
     CG.CodeGroup 
    FROM 
     dbo.Hoja3$ H 
     CROSS APPLY (
     SELECT TOP 1 * 
     FROM CodeGroupings CG 
     WHERE H.Code LIKE CG.CodePattern 
    ) CG 
) 
SELECT 
    * 
FROM 
    ManzanaCodeGroups 
    PIVOT (Count(*) FOR (CodeGroup IN CBrc, W1, PC1, SIN_ACCESO_A_INFORMACION)) P 
; 
Смежные вопросы