Sql server 2008 SQL Server订单描述和显示6/6
我在一个名为col1、col2、col3的表中有3列,其中包含整数值。有4000多行。有三个参数@first、@second、@third。我想根据此参数获取具有匹配项的行。该查询给出了结果,但没有给出3/3,或者如果没有匹配项,则不会显示,并且我希望将其降序排列。 我的输出应该是这样的Sql server 2008 SQL Server订单描述和显示6/6,sql-server-2008,Sql Server 2008,我在一个名为col1、col2、col3的表中有3列,其中包含整数值。有4000多行。有三个参数@first、@second、@third。我想根据此参数获取具有匹配项的行。该查询给出了结果,但没有给出3/3,或者如果没有匹配项,则不会显示,并且我希望将其降序排列。 我的输出应该是这样的 table : col1 col2 col3 3 4 5 1 2 2 7 7 9 3 2 3 1 8 9 1
table :
col1 col2 col3
3 4 5
1 2 2
7 7 9
3 2 3
1 8 9
1 2 3
first = 1 second = 2 and third = 3
3 / 3 1 ( as sixth row contains 1, 2, 3)
2 / 3 2 ( as second row and fourth row )
1 / 3 1 (fifth row)
0 / 3 2 (ist , third )
(
SELECT count (CASE WHEN col1 = @First THEN 1 ELSE 0 END +
CASE WHEN col2= @second THEN 1 ELSE 0 END +
CASE WHEN col3 = @third THEN 1 ELSE 0 END
)AS "NUM_OF_MATCHES" ,
CAST( CASE WHEN col1 = @First THEN 1 ELSE 0 END +
CASE WHEN col2= @sec/ond THEN 1 ELSE 0 END +
CASE WHEN col3 = @third THEN 1 ELSE 0 END
AS VARCHAR(10)) + '/ 3'
AS "match"
FrOM dbo.FormsDataRowFormat a
where ( SELECT CASE WHEN col1 = @First THEN 1 ELSE 0 END +
CASE WHEN col2= @second THEN 1 ELSE 0 END +
CASE WHEN col3 = @third THEN 1 ELSE 0 END AS "NUM_OF_MATCHES" ) >= 1
group by ( CASE WHEN col1 = @First THEN 1 ELSE 0 END +
CASE WHEN col2 = @second THEN 1 ELSE 0 END+
CASE WHEN col3 = @third THEN 1 ELSE 0 END )
)
对于输入数据:
/--------------------\
| col1 | col2 | col3 |
|------+------+------|
| 8 | 7 | 1 |
| 5 | 7 | 1 |
| 4 | 4 | 4 |
| 4 | 5 | 2 |
| 4 | 6 | 2 |
| 2 | 2 | 3 |
| 5 | 2 | 1 |
| 2 | 7 | 7 |
| 2 | 1 | 3 |
| 1 | 2 | 3 |
\--------------------/
与:
给出输出:
/----------------------\
| Matches | NumMatches |
|---------+------------|
| 0/3 | 6 |
| 1/3 | 2 |
| 2/3 | 1 |
| 3/3 | 1 |
\----------------------/
编辑-动态SQL解决方案:
下面是一个动态SQL解决方案,它将处理任意数量的列
但是请注意,动态SQL可能不是解决此问题的最佳解决方案,特别是当它将重复多次和/或在非常大的数据集上运行时。然而,这是我所知道的实现这一点的唯一方法,所以我想将其包括在内(并且非常高兴看到其他用户提供更好的解决方案!)
这没有帮助,请用您的预期结果和实际结果更新您的问题。请查看此链接()以了解如何构建一个好问题。如果有6列,我将重复此查询六次。那么您有3列(根据您的问题),还是6列?你是说列数是可变的吗?如果是这样,你应该在问题中说明这一点。如果您愿意,我上面给出的解决方案可以很容易地为任意数量的静态列重写。如果您的列数是可变的,我们将不得不采取稍微复杂一点的方法。谢谢您的回复。目前calomn可能会注意到最多有3列6Ok,所以总共有3到6列之间的可变列数?如果是这样的话,你真的应该把这个添加到你的问题中,以避免得到毫无帮助的答案。谢谢你的友好回复。目前共有3列,列数最多可能变化6秒您的答案是给出结果水平形式我希望结果是垂直形式,如3/3 1 2/3 1/3 2 0/3 6
@first = 1
@second = 2
@third = 3
/----------------------\
| Matches | NumMatches |
|---------+------------|
| 0/3 | 6 |
| 1/3 | 2 |
| 2/3 | 1 |
| 3/3 | 1 |
\----------------------/
DECLARE @numColumns INT
SELECT @numColumns = COUNT(*) FROM sysobjects o JOIN syscolumns c ON o.id = c.id WHERE o.name = 'FormsDataRowFormat'
DECLARE @sql NVARCHAR(MAX)
SET @sql =
'SELECT ' +
'''0/' + CONVERT(VARCHAR,@numColumns) + ''' AS Matches, ' +
'SUM(CASE WHEN (CASE WHEN col1 = ' + CONVERT(VARCHAR,@first) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col2 = ' + CONVERT(VARCHAR,@second) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col3 = ' + CONVERT(VARCHAR,@third) + ' THEN 1 ELSE 0 END' +
CASE WHEN @numColumns >= 4 THEN ' + CASE WHEN col4 = ' + CONVERT(VARCHAR,@fourth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN ' + CASE WHEN col5 = ' + CONVERT(VARCHAR,@fifth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns = 6 THEN ' + CASE WHEN col6 = ' + CONVERT(VARCHAR,@sixth) + ' THEN 1 ELSE 0 END' ELSE '' END +
') = 0 THEN 1 ELSE 0 END) AS NumMatches ' +
'FROM FormsDataRowFormat ' +
'UNION ' +
'SELECT ''1/' + CONVERT(VARCHAR,@numColumns) + ''' AS Matches, ' +
'SUM(CASE WHEN (CASE WHEN col1 = ' + CONVERT(VARCHAR,@first) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col2 = ' + CONVERT(VARCHAR,@second) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col3 = ' + CONVERT(VARCHAR,@third) + ' THEN 1 ELSE 0 END' +
CASE WHEN @numColumns >= 4 THEN ' + CASE WHEN col4 = ' + CONVERT(VARCHAR,@fourth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN ' + CASE WHEN col5 = ' + CONVERT(VARCHAR,@fifth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns = 6 THEN ' + CASE WHEN col6 = ' + CONVERT(VARCHAR,@sixth) + ' THEN 1 ELSE 0 END' ELSE '' END +
') = 1 THEN 1 ELSE 0 END) AS NumMatches ' +
'FROM FormsDataRowFormat ' +
'UNION ' +
'SELECT ''2/' + CONVERT(VARCHAR,@numColumns) + ''' AS Matches, ' +
'SUM(CASE WHEN (CASE WHEN col1 = ' + CONVERT(VARCHAR,@first) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col2 = ' + CONVERT(VARCHAR,@second) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col3 = ' + CONVERT(VARCHAR,@third) + ' THEN 1 ELSE 0 END' +
CASE WHEN @numColumns >= 4 THEN ' + CASE WHEN col4 = ' + CONVERT(VARCHAR,@fourth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN ' + CASE WHEN col5 = ' + CONVERT(VARCHAR,@fifth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns = 6 THEN ' + CASE WHEN col6 = ' + CONVERT(VARCHAR,@sixth) + ' THEN 1 ELSE 0 END' ELSE '' END +
') = 2 THEN 1 ELSE 0 END) AS NumMatches ' +
'FROM FormsDataRowFormat ' +
'UNION ' +
'SELECT ''3/' + CONVERT(VARCHAR,@numColumns) + ''' AS Matches, ' +
'SUM(CASE WHEN (CASE WHEN col1 = ' + CONVERT(VARCHAR,@first) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col2 = ' + CONVERT(VARCHAR,@second) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col3 = ' + CONVERT(VARCHAR,@third) + ' THEN 1 ELSE 0 END' +
CASE WHEN @numColumns >= 4 THEN ' + CASE WHEN col4 = ' + CONVERT(VARCHAR,@fourth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN ' + CASE WHEN col5 = ' + CONVERT(VARCHAR,@fifth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns = 6 THEN ' + CASE WHEN col6 = ' + CONVERT(VARCHAR,@sixth) + ' THEN 1 ELSE 0 END' ELSE '' END +
') = 3 THEN 1 ELSE 0 END) AS NumMatches ' +
'FROM FormsDataRowFormat ' +
CASE WHEN @numColumns >= 4 THEN
'UNION ' +
'SELECT ''4/' + CONVERT(VARCHAR,@numColumns) + ''' AS Matches, ' +
'SUM(CASE WHEN (CASE WHEN col1 = ' + CONVERT(VARCHAR,@first) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col2 = ' + CONVERT(VARCHAR,@second) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col3 = ' + CONVERT(VARCHAR,@third) + ' THEN 1 ELSE 0 END' +
CASE WHEN @numColumns >= 4 THEN ' + CASE WHEN col4 = ' + CONVERT(VARCHAR,@fourth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN ' + CASE WHEN col5 = ' + CONVERT(VARCHAR,@fifth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns = 6 THEN ' + CASE WHEN col6 = ' + CONVERT(VARCHAR,@sixth) + ' THEN 1 ELSE 0 END' ELSE '' END +
') = 4 THEN 1 ELSE 0 END) AS NumMatches ' +
'FROM FormsDataRowFormat ' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN
'UNION ' +
'SELECT ''5/' + CONVERT(VARCHAR,@numColumns) + ''' AS Matches, ' +
'SUM(CASE WHEN (CASE WHEN col1 = ' + CONVERT(VARCHAR,@first) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col2 = ' + CONVERT(VARCHAR,@second) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col3 = ' + CONVERT(VARCHAR,@third) + ' THEN 1 ELSE 0 END' +
CASE WHEN @numColumns >= 4 THEN ' + CASE WHEN col4 = ' + CONVERT(VARCHAR,@fourth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN ' + CASE WHEN col5 = ' + CONVERT(VARCHAR,@fifth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns = 6 THEN ' + CASE WHEN col6 = ' + CONVERT(VARCHAR,@sixth) + ' THEN 1 ELSE 0 END' ELSE '' END +
') = 5 THEN 1 ELSE 0 END) AS NumMatches ' +
'FROM FormsDataRowFormat ' ELSE '' END +
CASE WHEN @numColumns = 6 THEN
'UNION ' +
'SELECT ''6/' + CONVERT(VARCHAR,@numColumns) + ''' AS Matches, ' +
'SUM(CASE WHEN (CASE WHEN col1 = ' + CONVERT(VARCHAR,@first) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col2 = ' + CONVERT(VARCHAR,@second) + ' THEN 1 ELSE 0 END + ' +
'CASE WHEN col3 = ' + CONVERT(VARCHAR,@third) + ' THEN 1 ELSE 0 END' +
CASE WHEN @numColumns >= 4 THEN ' + CASE WHEN col4 = ' + CONVERT(VARCHAR,@fourth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns >= 5 THEN ' + CASE WHEN col5 = ' + CONVERT(VARCHAR,@fifth) + ' THEN 1 ELSE 0 END' ELSE '' END +
CASE WHEN @numColumns = 6 THEN ' + CASE WHEN col6 = ' + CONVERT(VARCHAR,@sixth) + ' THEN 1 ELSE 0 END' ELSE '' END +
') = 6 THEN 1 ELSE 0 END) AS NumMatches ' +
'FROM FormsDataRowFormat' ELSE '' END
EXEC sp_executesql @sql