2012-07-05 60 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