簡體   English   中英

SQL Server查詢以查找具有聚合功能的記錄在一列中但在select子句中有多列

[英]SQL Server Query to find records with aggregate funct on one column but multiple columns in select clause

這是Customer表的最小化版本。 可能有具有相同帳號的客戶映射到不同的Group。 我正在尋找找出映射到多個組的客戶編號。 當我使用sybase時,下面的查詢工作正常。 相同查詢在SQL Server中不起作用。

我可以在以下一個查詢中同時獲取custAccnt和相應的custId。

select DISTINCT lt.custAccnt, lt.custId from VAL_CUSTOMERS lt 
where lt.eligible = 'Y' group by lt.custAccnt 
having count(distinct lt.custId) > 1

+----------+-----------+---------+----------+
| custName | custAccnt | custId  | eligible |
+----------+-----------+---------+----------+
| Joe      | AB1VU1235 |   43553 | Y        |
| Joe      | AB1VU1235 |  525577 | Y        |
| Lucy     | CDNMY4568 |  332875 | Y        |
| Lucy     | CDNMY4568 |  211574 | Y        |
| Lucy     | CDNMY4568 |  211345 | Y        |
| Manie    | TZMM7S009 |  123890 | Y        |
| Tom      | YFDU1235  | 1928347 | Y        |
| Tom      | YFDU1235  |  204183 | Y        |
| Chef     | TNOTE6573 |  734265 | Y        |
+----------+-----------+---------+----------+

結果:-

+-----------+---------+
| AB1VU1235 |   43553 |
| AB1VU1235 |  525577 |
| CDNMY4568 |  332875 |
| CDNMY4568 |  211574 |
| CDNMY4568 |  211345 |
| YFDU1235  | 1928347 |
| YFDU1235  |  204183 |
+-----------+---------+

我認為這可能有效...

“ ...映射到多個組的客戶編號...”,<- groupcustAcct嗎?

select t.custAccnt, t.custId 
from VAL_CUSTOMERS t 
where (Select count(distinct custAccnt ) 
       from VAL_CUSTOMERS 
       Where custId = t.custId) > 1

語句“ ...映射到多個組的客戶編號...”沒有提及“資格”,因此我沒有提及。 如果您真的要說:

“ ...映射到多個組的合格客戶編號...”,然后嘗試以下操作:

select t.custAccnt, t.custId 
from VAL_CUSTOMERS t 
where eligible = 'Y'
  and (Select count(distinct custAccnt ) 
       from VAL_CUSTOMERS 
       Where custId = t.custId) > 1

或者,這可能會更快...它回答的問題略有不同,但是(我認為)同等的問題,
“找到…… 合格的客戶編號,其中同一客戶編號的另一行已映射到不同的custAccnt ...”

select t.custAccnt, t.custId 
from VAL_CUSTOMERS t 
where eligible = 'Y'
  and exists 
      (Select * from VAL_CUSTOMERS 
       Where custId = t.custId
         and custAccnt != t.custAccnt ) 

有很多方法可以解決這個問題。 這里有一些應該起作用的。

select lt.custAccnt
    , lt.custId 
from VAL_CUSTOMERS lt 
cross apply
(
    select c.custAccnt
    from VAL_CUSTOMERS c
    where c.custAccnt = lt.custAccnt
    group by c.custAccnt
    having count(*) > 1
) x
where lt.eligible = 'Y'


select lt.custAccnt
    , lt.custId 
from VAL_CUSTOMERS lt 
where lt.eligible = 'Y'
AND lt.custAccnt IN
(
    select c.custAccnt
    from VAL_CUSTOMERS c
    group by c.custAccnt
    having count(*) > 1
) 

如果表中的custAccnt和custId重復,則@Sean查詢將不起作用。

WITH cte AS(SELECT *
                 , COUNT (custId) OVER (PARTITION BY custAccnt) AS CntcustId
                 , ROW_NUMBER () OVER (PARTITION BY custAccnt, custId ORDER BY custName)    AS Rownum
                 FROM VAL_CUSTOMERS
                 WHERE eligible = 'Y'
)
SELECT custAccnt, custId
FROM cte
WHERE CntcustId>1
AND Rownum = 1;

使用行號消除重復項。

;WITH cte1
( custName , custAccnt , custId  , eligible )
As
(

 SELECT 'Joe'      ,'AB1VU1235' ,   43553 , 'Y'    UNION ALL
 SELECT 'Joe'      ,'AB1VU1235' ,  525577 , 'Y'    UNION ALL
 SELECT 'Lucy'     ,'CDNMY4568' ,  332875 , 'Y'    UNION ALL
 SELECT 'Lucy'     ,'CDNMY4568' ,  211574 , 'Y'    UNION ALL
 SELECT 'Lucy'     , 'CDNMY4568' ,  211345 , 'Y'   UNION ALL
 SELECT 'Manie'    ,'TZMM7S009' ,  123890 , 'Y'    UNION ALL
 SELECT 'Tom'      ,'YFDU1235'  , 1928347 , 'Y'    UNION ALL
 SELECT 'Tom'      ,'YFDU1235'  ,  204183 , 'Y'    UNION ALL
 SELECT 'Chef'     ,'TNOTE6573' ,  734265 , 'Y'    
  )

,cte2 AS (
    SELECT custName
          ,custAccnt
          ,count(custName) cnt
    FROM cte1
    GROUP BY custName,custAccnt
    )
,cte3 AS (
    SELECT custName
        ,cnt
    FROM cte2 WHERE cnt <> 1
         )

SELECT custAccnt
    ,custId
FROM cte1
WHERE custName IN (
        SELECT custName
        FROM cte3
        )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM