简体   繁体   English

使用 SQL Server 2008 统计数据

[英]Count data using SQL Server 2008

I'm using SQL Server 2008 and I have a big database, I need to count the data for every manzana but every rows is 0 so I don't know how to do that我正在使用 SQL Server 2008 并且我有一个大数据库,我需要计算每个 manzana 的数据但每一行都是 0 所以我不知道该怎么做

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

I need to obtain something like this我需要获得这样的东西

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

After reading your comment "I try to count how many Cbrc,Pc1, Clu etc I have in every Manzana" I see the problem.在阅读了您的评论“我尝试计算每个 Manzana 中有多少 Cbrc、Pc1、Clu 等”后,我看到了问题所在。

You're using the IN operator incorrectly.您错误地使用了IN运算符。

To test fo the occurrence of a substring use the CHARINDEX function:要测试子字符串的出现,请使用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

You can't group by Manzana and not group by Manzana .你可以不按组Manzana通过,而不是组Manzana Also, from the sample data, I can tell that you haven't provided enough information.另外,从样本数据中,我可以看出您没有提供足够的信息。 Just from the first row:仅从第一行:

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

If Manzana is 5445 , then what column has the value CBrc ?如果Manzana5445 ,那么哪一列的值是CBrc It can't be the Manzana column, but has to be some other column.它不能是Manzana列,而必须是其他一些列。 In this vacuum of information, I'm going to call the mystery column Code .在这种信息真空中,我将把神秘专栏称为Code

Then try this (of course, you'll need to put all your code groups in):然后试试这个(当然,你需要把所有的代码组放进去):

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
;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM