Sql 查找列的唯一组合
我试图编写一个select查询,但遇到了问题,可能是因为我不熟悉SQL Server(通常使用Sql 查找列的唯一组合,sql,sql-server,Sql,Sql Server,我试图编写一个select查询,但遇到了问题,可能是因为我不熟悉SQL Server(通常使用MySQL) 基本上,我需要做的是找到两列的唯一组合数,一列是aVarchar,另一列是aDouble 一行中的行数比另一行少,所以我一直在努力找出正确的方法 本质上是假装表。Varchar中包含: Table.Varchar -------------- apple orange Table.Float -------------- 1 2 3. 和表。浮点数中包含: Tabl
MySQL
)
基本上,我需要做的是找到两列的唯一组合数,一列是aVarchar
,另一列是aDouble
一行中的行数比另一行少,所以我一直在努力找出正确的方法
本质上是假装表。Varchar中包含:
Table.Varchar
--------------
apple
orange
Table.Float
--------------
1
2
3.
和表。浮点数中包含:
Table.Varchar
--------------
apple
orange
Table.Float
--------------
1
2
3.
如何编写返回的查询
QueryResult
-------------
apple1
apple2
apple3
orange1
orange2
orange3
我工作了一整天,我想我只是想得太多了。到目前为止,我试着把这两个列连在一起,然后数一数,但都不起作用。有什么更好的办法吗?如果它们在同一张表中:
SELECT a.Field1, b.Field2
FROM [Table] a
CROSS JOIN [Table] b
或者如果它们在单独的表格中:
SELECT a.Field1, b.Field2
FROM [Table1] a
CROSS JOIN [Table2] b
请记住,上述查询将第一个表中的所有记录与第二个表中的所有记录相匹配,如果它们位于同一个表中,则会创建一个。:
SELECT a.Field1, b.Field2
FROM [Table] a
CROSS JOIN [Table] b
或者如果它们在单独的表格中:
SELECT a.Field1, b.Field2
FROM [Table1] a
CROSS JOIN [Table2] b
请记住,上述查询将第一个表中的所有记录与第二个表中的所有记录相匹配,从而创建一个新的查询
这样,您将生成字段
所以,然后分组并使用Count
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
这样,您将生成字段
所以,然后分组并使用Count
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
交叉联接是一种联接,其中一个表中的每条记录与另一个表中的每条记录相结合。从表中选择不同的值并联接它们
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)
交叉联接是一种联接,其中一个表中的每条记录与另一个表中的每条记录相结合。从表中选择不同的值并联接它们
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)
这将消除重复项:
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;
这将消除重复项:
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;
试试这个
可能的联合国
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
为了得到可能的联合国数目
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
试试这个
可能的联合国
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
为了得到可能的联合国数目
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
这两个字段在同一个表中吗?听起来好像是这样,但是一个字段的记录怎么会比另一个字段的记录少呢?你的意思是有些值是空的吗?你能说明这些值是如何实际存储在行中的吗?带苹果和橙色的行与1/2/3的行是同一行,还是有5行不同?Table.varchar是表还是列?如果Apple在varchar中出现两次,或者2在float中出现两次,该怎么办?这两个字段在同一个表中吗?听起来好像是这样,但是一个字段的记录怎么会比另一个字段的记录少呢?你的意思是有些值是空的吗?你能说明这些值是如何实际存储在行中的吗?带苹果和橙色的行与1/2/3的行是同一行,还是有5行不同?Table.varchar是表还是列?如果Apple在varchar中出现两次,或者2在float中出现两次,该怎么办?@AaronBertrand第一个查询将第一个字段(Apple,orange)中的每个项目与第二个字段(1,2)中的每个项目相匹配,以生成Apple 1、Apple 2、orange 1、orange 2。您可以在不指定两次表的情况下执行此操作吗?@AaronBertrand第一个查询将第一个字段(苹果,橙色)中的每个项目与第二个字段(1,2)中的每个项目进行匹配,以生成苹果1、苹果2、橙色1、橙色2。您可以在不指定两次表的情况下执行此操作吗?