SQL查询根据过滤后的状态获取计数

时间:2015-10-13 08:29:27

标签: sql sql-server-2008

我的桌子有两列CustomerId& Status(A,B,C)。

客户可以在不同的行中拥有多个状态。

我需要根据以下规则获取不同状态的计数:

  1. 如果客户的状态是A& B,他应该被计入状态A.
  2. 如果状态是B& C,应该在状态B中计算。
  3. 如果状态全部为三,则它将处于状态A。
  4. 我需要的是一张有状态和计数的表格。

    可以请别人帮忙吗?

    我知道有人会先请我写我的查询,但我无法理解如何在查询中实现这个逻辑。

2 个答案:

答案 0 :(得分:2)

您可以使用不同的变体:

String baseUrl = "http://abcd.eng.xyz.com/wiremap/index.php?action=search&page=0&port_name=&dev_type=like&output=xml&dev_name=w2-fiqa-058";
String xmlRecords = get(baseUrl).asString();

DocumentBuilderFactory factory2 = DocumentBuilderFactory.newInstance();

factory2.setNamespaceAware(true);
DocumentBuilder builder2 = factory2.newDocumentBuilder();
Document document = builder2.parse(new ByteArrayInputStream(xmlRecords.getBytes()));
String test = document.getTextContent();
System.out.println("Value " +test);

System.out.println(document);

答案 1 :(得分:0)

我喜欢使用Cross Apply进行此类查询,因为它允许在Group By子句中使用计算状态。

这是我的解决方案,包含一些示例数据。

Declare @Table Table (Customerid int, Stat varchar(1))

INSERT INTO @Table  (Customerid, Stat ) 
VALUES
(1, 'a'), 
(1 , 'b'),
(2, 'b'),
(2 , 'c'),
(3, 'a'),
(3 , 'b'),
(3, 'c')



SELECT
ca.StatusGroup 
, COUNT(DISTINCT Customerid) as Total
FROM
@Table t
CROSS APPLY
   (VALUES
        (
         CASE WHEN 
             EXISTS 
             (SELECT 1 FROM @Table x where x.Customerid = t.CustomerID and x.Stat = 'a') 
             AND EXISTS
            (SELECT 1 FROM @Table x where x.Customerid = t.CustomerID and x.Stat = 'b') 
             THEN 'A'
      WHEN 
            EXISTS 
             (SELECT 1 FROM @Table x where x.Customerid = t.CustomerID and x.Stat = 'b') 
             AND EXISTS
            (SELECT 1 FROM @Table x where x.Customerid = t.CustomerID and x.Stat = 'c') 
             THEN 'B'
             ELSE t.stat
        END 
        )
     ) ca (StatusGroup)

GROUP BY ca.StatusGroup

我编辑了这个以处理只有一个状态的客户......在这种情况下,它将根据客户状态返回A,B或C