2013-07-15 91 views
0

我在表中有一个PromoID字段。我需要弄清楚如何显示所有记录中,其中前6个本地字符都是相同的:返回字段具有相同前缀的所有记录

PromoID 
======= 
100001 
100001A 
100001B 
101001 
100002 
100002A 

结果我期望从上面会看到:

PromoID 
======= 
100001 
100001A 
100001B 
100002 
100002A 

101001被切除的它没有另一个带有“101001”前缀的记录。

感谢

回答

8
SELECT PromoID 
FROM YourTable A 
WHERE EXISTS(SELECT LEFT(PromoID,6) 
      FROM YourTable 
      WHERE LEFT(PromoID,6) = LEFT(A.PromoID,6) 
      GROUP BY LEFT(PromoID,6) 
      HAVING COUNT(*) > 1) 

这是结果:

╔═════════╗ 
║ PromoID ║ 
╠═════════╣ 
║ 100001 ║ 
║ 100001A ║ 
║ 100001B ║ 
║ 100002 ║ 
║ 100002A ║ 
╚═════════╝ 

Here is与演示的sqlfiddle。

+0

哎呀你快:) –

+0

+1最快,很好的答案! :) –

0

您可以用公共表表达式做到这一点:

WITH CTE (Prefix) AS 
    (select LEFT(PromoId, 6) from Foo GROUP BY LEFT(PromoId, 6) HAVING COUNT(1) > 1) 
SELECT PromoId FROM Foo 
INNER JOIN CTE ON LEFT(PromoId, 6) = CTE.Prefix; 

Fiddle

+0

这种方式将只有列的截断部分,而不是他/他想要的结果 – Lamak

+0

@Lamak - 谢谢,修复! –

+1

立即下架现在 – Lamak

6

如果您使用的是SQL Server 2005或更高版本,这应该为你工作:

SELECT PromoID 
FROM (
    SELECT *, COUNT(*) OVER (PARTITION BY LEFT(PromoID, 6)) AS cnt 
    FROM atable 
) s 
WHERE cnt > 1 
; 

你也可以试试这个at SQL Fiddle

+1

+1,不错的选择 – Lamak

1

你也可以做到这一点使用子查询

SELECT PromoID FROM YourTable 
WHERE LEFT(PromoID,6) IN 
(
SELECT LEFT(PromoID,6) 
FROM YourTable 
Group By LEFT(PromoID, 6) 
HAVING COUNT(*) > 1 
) 

Fiddle Demo

0

内查询列出所有PromoID拒绝。外部查询通吃PromoID减去拒绝的:

SELECT * 
    FROM table1 
WHERE PromoID not in (
    SELECT t1.PromoID 
     FROM table1 t1 
    LEFT JOIN table1 t2 ON t1.PromoID != t2.PromoID 
      AND left(t1.PromoID, 6) = left(t2.PromoID, 6) 
    WHERE t2.PromoID IS NULL 
) 

SQL Fiddle

相关问题