2012-07-05 75 views
1

我想写一个选择查询但有麻烦,可能是因为我不熟悉SQL Server(通常使用MySQL)。查找列的唯一组合

基本上我需要做的是找到2列的唯一组合的数量,其中一个Varchar和一个Double

一行比另一行少,所以我一直试图找出正确的方法来做到这一点。

本质假装Table.Varchar中有:

Table.Varchar 
-------------- 
apple 
orange 

和Table.Float中有:

Table.Float 
-------------- 
1 
2 
3. 

我怎么能编写一个查询返回

QueryResult 
------------- 
apple1 
apple2 
apple3 
orange1 
orange2 
orange3 

工作时间很长,我认为我只是在推翻这一点,到目前为止我尝试过的是连接两列,然后计数,没有工作。任何想法更好地去做这件事?

+0

都在同一个表中这些字段?听起来像是这样,但是一个领域怎么能有比其他领域更少的记录?你的意思是有些值是空的吗? – 2012-07-05 23:21:41

+0

你能说明这些实际上是如何存储在行中的吗?苹果和桔子的行与1/2/3相同,或者这里有5个不同的行吗? Table.varchar是表还是列? – 2012-07-05 23:25:23

+0

如果苹果在varchar中出现两次,或者两次出现在float中,该怎么办? – 2012-07-05 23:31:56

回答

1

如果他们是在同一个表:

SELECT a.Field1, b.Field2 
FROM [Table] a 
    CROSS JOIN [Table] b 

,或者如果他们是在单独的表:

SELECT a.Field1, b.Field2 
FROM [Table1] a 
    CROSS JOIN [Table2] b 

记住上面的查询将匹配从第一ALL记录表全部记录来自第二张表,创建一个cartesian product

+0

@AaronBertrand第一个查询会将第一个字段(苹果,橙色)中的每个项目与第二个字段(1,2)中的每个项目进行匹配,以生成苹果1,苹果2,橙色1,橙色2。指定表两次? – 2012-07-05 23:31:45

2
Select T1.VarcharField + CAST(T2.FloatField as Varchar(10)) as [Concat] 
from Table.Varchar T1 
CROSS JOIN Table.Float T2 

这种方式,要生成字段

是这样,则通过组和使用计数

select T.Concat, count(*) from 
(Select T1.VarcharField + CAST(T2.FloatField as Varchar(10)) as [Concat] 
    from Table.Varchar T1 
    CROSS JOIN Table.Float T2) T 
group by T.Concat order by count(*) asc 
+0

不要阅读那部分。编辑投射 – 2012-07-05 23:29:48

0

交叉连接被联接,其中在一个表中的每个记录都与每个组合另一张桌子的纪录。从表中选择不同的值并加入它们。

select x.Varchar, y.Float 
from (select distinct Varchar from theTable) x 
cross join (select distinct Float from theTable) y 

要找到组合的数量,您不必实际返回所有组合,只需对它们进行计数即可。

select 
    (select count(distinct Varchar) from theTable) * 
    (select count(distinct Float) from theTable) 
1

这将消除重复:

DECLARE @Varchar TABLE(v VARCHAR(32)); 

DECLARE @Float TABLE(f FLOAT); 

INSERT @Varchar SELECT 'apple' 
    UNION ALL SELECT 'orange' 
    UNION ALL SELECT 'apple'; 

INSERT @Float SELECT 1 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3; 

SELECT v.v + CONVERT(VARCHAR(12), f.f) 
FROM @Varchar AS v 
CROSS JOIN @Float AS f 
GROUP BY v.v, f.f; 
0

尝试这个

可能Cominations。

SELECT 
DISTINCT T1.VarField+CONVERT(VARCHAR(12),T2.FtField) --Get Unique Combinations 
FROM Table1 T1 CROSS JOIN Table2 T2 --From all possible combinations 
WHERE T1.VarField IS NOT NULL AND T2.FtField IS NOT NULL --Making code NULL Proof 

和刚刚得到的可能Cominations计数

SELECT Count(DISTINCT T1.VarcharField + CONVERT(VARCHAR(12), T2.FloatField)) 
FROM Table1 T1 
CROSS JOIN Table2 T2 
WHERE T1.VarcharField IS NOT NULL AND T2.FloatField IS NOT NULL