Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server订单描述和显示6/6_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL Server订单描述和显示6/6

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

我在一个名为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      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