Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

TSQL Distinct Counts

Може да се наложи да използвате временна таблица или променлива на таблица, както е показано по-долу

     DECLARE @t TABLE (
    ID INT
    ,SuppressionTypeID INT
    ,PersonID INT
    )

INSERT INTO @t
SELECT 1
    ,1
    ,123

UNION ALL

SELECT 2
    ,1
    ,456

UNION ALL

SELECT 3
    ,2
    ,456

DECLARE @t1 TABLE (
    ID INT
    ,SuppressionTypeID INT
    ,PersonID INT
    ,firstid INT
    )

INSERT INTO @t1
SELECT *
    ,NULL
FROM @t

UPDATE t1
SET t1.firstid = t2.firstid
FROM @t1 AS t1
INNER JOIN (
    SELECT personid
        ,min(SuppressionTypeID) AS firstid
    FROM @t1
    GROUP BY personid
    ) AS t2 ON t1.PersonID = t2.PersonID

SELECT coalesce(t2.firstid, t1.SuppressionTypeID) AS SuppressionTypeID
    ,count(DISTINCT t2.personid) AS count
FROM @t1 AS t1
LEFT JOIN @t1 AS t2 ON t1.personid = t2.personid
    AND t1.SuppressionTypeID = t2.firstid
GROUP BY coalesce(t2.firstid, t1.SuppressionTypeID)

Резултатът е

SuppressionTypeID count
----------------- -----------
1                 2
2                 0


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Период на изчакване на семафора

  2. SQL Server 2005 - Експортирайте таблицата програмно (изпълнете .sql файл, за да го изградите отново)

  3. Сигурен трансфер на данни от SQL сървър към SQL сървър през Интернет

  4. Възможно ли е да се зададе време за изчакване за SQL заявка на Microsoft SQL Server?

  5. replace съвпада само с началото на низа