繁体   English   中英

如何在SQL查询中对多个列使用非重复计数

[英]How to use distinct and count for multiple columns in SQL query

MyTable的:

+-----------+-----------+---------+
| Cust_Name | Contract  | Status  |
+-----------+-----------+---------+
| ABC       | CISCO     | Active  |
| DEF       | Microsoft | Expired |
| ABC       | HP        | Expired |
| DEF       | DELL      | Active  |
| ABC       | CISCO     | Active  |
+-----------+-----------+---------+

MS SQL查询:

SELECT Cust_Name, Active_count,
       Contract = substring(List, 1, len(List) - 1)
FROM   (SELECT Cust_Name, COUNT(*) AS Active_count
        FROM  mytable
        WHERE status = 'Active'
        GROUP BY Cust_Name) AS a
CROSS  APPLY (SELECT    (SELECT Contract + ',  '
                 FROM   Mytable b
                 WHERE  b.Cust_Name = a.Cust_Name
                   AND  b.Status = 'Active'
                 FOR XML PATH(''), TYPE).value('.',  'nvarchar(MAX)')) AS b(List)

根据我的查询,我无法获得如下结果。我如何获得如下结果:

+-----------+--------------+--------------+
| Cust_Name | Active_count |  Contracts   |
+-----------+--------------+--------------+
| ABC       |            2 | CISCO,Oracle |
| DEF       |            1 | DELL         |
+-----------+--------------+--------------+

我会在最后使用STUFF()而不是SUBSTRING()编写查询。 无论如何,我认为您只需要在子查询中使用SELECT DISTINCT

SELECT a.Cust_Name, a.Active_count, Contract = b.List
FROM (SELECT Cust_Name, COUNT(DISTINCT Contract) AS Active_count
      FROM  mytable
      WHERE STS_CODE = 'Active'
      GROUP BY Cust_Name
     ) a CROSS  APPLY
     (SELECT STUFF((SELECT DISTINCT b.Contract + ',  '
                    FROM Mytable b
                    WHERE b.Cust_Name = a.Cust_Name AND  b.Status = 'Active'
                    FOR XML PATH(''), TYPE
                   ).value('.',  'nvarchar(MAX)'), 1, 2, ''
                  )
     ) AS b(List);

请试试这个:

WITH CTE_Testtable AS (
 SELECT 
  Cust_Name,
  Contract,
  Status 
 FROM
  TESTTable
 WHERE
 Status = 'Active'
 GROUP BY 
 Cust_Name, Contract, Status
)
SELECT
 Cust_Name,
 COUNT(Cust_Name) Active_Count,
 STUFF((SELECT ', ' + Contract
  FROM 
   TESTTable B
  WHERE 
   B.Cust_Name = A.Cust_Name 
   AND Status = 'Active'
  GROUP BY Contract
  FOR XML PATH('')), 1, 2, '') 
FROM
 CTE_Testtable A
WHERE
 Status = 'Active'
GROUP BY 
 Cust_Name

暂无
暂无

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

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