-2

「Students」という名前のテーブルがあり、次のようなフィールドがあります...

Student          Code1      Code2      Code3      Code4

Mark             0           1         1          1        1
Joseph           0           1         0          1        0
Bryan.           0           0         1          1        1

したがって、SQLクエリは、2つ以上の1を持つ学生を選択する必要があり、それも連続している必要があります。上記の場合.. MarkとBryanを返す必要がありますが、Josephは返しません。

4

3 に答える 3

1

それを行う別の方法

SELECT Student
FROM 
(
  SELECT Student,(CONVERT(CHAR(1),Code1) + 
                  CONVERT(CHAR(1),Code2) + 
                  CONVERT(CHAR(1),Code3) + 
                  CONVERT(CHAR(1),Code4)) AS Codes
  FROM Students
) s1
WHERE CHARINDEX('11', Codes) > 0

これがsqlfiddleです

于 2013-02-10T06:55:49.843 に答える
0

スキーマが非常に奇妙であるのは事実ですが、SQL Server 2005以降を使用している場合は、UNPIVOTを使用して簡単に解決できます。すべてのコードのハードコードされたリストをピボット解除に提供する必要があることに注意してください...

WITH pvt (student, code, value) as (
        SELECT 
            Student,
            ROW_NUMBER()OVER(Partition By Student Order By Codes) as CodeId, 
            Value
        FROM 
            ( select * from students ) P
        UNPIVOT ( 
            Value FOR Codes IN (Code1, Code2, Code3, Code4, Code5) 
        ) Code
    )

    select 
    distinct
        pvt.student
    from 
        pvt
        inner join pvt p2
            on p2.code = pvt.code + 1
            and p2.student = pvt.student
    where 
        pvt.value = 1 and p2.value = 1

ここでの本当の利点は、さまざまなコードを1か所で処理するだけでよいことです。たとえばCode6を追加する場合は、UNPIVOTに追加するだけで、コードに組み込まれます。

また、これは「学生はコードに2つの連続した1が必要」というより一般的な要件を解決するだけであることに注意してください。生徒が1をいくつ持っているかを確認したり、2つの値がどこにあるかを気にしたりすることはありません。

最後の注意点は、ROW_NUMBER()関数は、コードがギャップなしで順番に名前が付けられていることを前提としているため、Code7からCode9に移行する場合、これら2つは「連続的」であると想定することです。

于 2013-02-10T06:45:58.580 に答える
0

ほんの一握りの列の場合:

Select *
From Students
Where ( Code1 + Code2 ) = 2
    Or ( Code2 + Code3 ) = 2
    Or ( Code3 + Code4 ) = 2
    Or ( Code4 + Code5 ) = 2

別の解決策:

With NormalizedData As
    (
    Select Student, Code1, 1 As Sequence From Students Where Code1 = 1
    Union All Select Student, Code2, 2 From Students Where Code2 = 1
    Union All Select Student, Code3, 3 From Students Where Code3 = 1
    Union All Select Student, Code4, 4 From Students Where Code4 = 1
    Union All Select Student, Code5, 5 From Students Where Code5 = 1
    )
Select ...
From Students As S
Where Exists    (
                Select 1
                From NormalizedData As N1
                    Join NormalizedData As N2
                        On N2.Student = N1.Student
                            And N2.Sequence = N1.Sequence + 1
                Where N1.Student = S.Student
                )
于 2013-02-10T06:37:04.533 に答える