1

以下の記録があります。

Id    Date          MondayMorning  MondayEvening  TuesdayMorning TuesdayEvening and so on
1   2012-01-01          2               3               2              2
2   2012-01-02          2               2               2              2

mondaymorning と mondayevening の状態が同じではないため、レコード 1 を 2 つのレコードに分割します。状態が同じ場合は、何もしません。

私が期待する結果:

Id    Date          MondayMorning  MondayEvening  TuesdayMorning  TuesdayEvening
1   2012-01-01          2               NULL          2                 2
1   2012-01-01          NULL            3             NULL              NULL
2   2012-01-02          2               2             2                 2

他の日も異なる場合がありますのでご注意ください。

私はすでにクエリを持っていますが、いくつかの変更が必要です。SQL Fiddleのクエリを参照してください 。ここに表示される出力は、問題が発生した場合です。TuesdayEvening と MondayEvening については、2 を期待しています。

SQL Fiddle に関する情報は次のとおりです。

Declare @t Table(Id int identity,[Date] Datetime,MondayMorning Int,MondayEvening Int,TuesdayMorning Int,TuesdayEvening Int)
Insert Into @t Select '2012-01-01',0,2,0,2

SELECT id
    ,date
    ,MondayMorning
    ,(CASE WHEN MondayEvening <> MondayMorning THEN NULL ELSE MondayEvening END) AS MondayEvening
    ,TuesdayMorning
    ,(CASE WHEN TuesdayEvening <> TuesdayMorning THEN NULL ELSE TuesdayEvening END) AS TuesdayEvening
FROM @t 

UNION ALL 

SELECT id
    ,date
    ,NULL AS MondayMorning
    ,(CASE WHEN MondayEvening = MondayMorning THEN NULL ELSE MondayEvening END) AS MondayEvening
    ,NULL AS TuesdayMorning
    ,(CASE WHEN TuesdayEvening = TuesdayMorning THEN NULL ELSE TuesdayEvening END) AS TuesdayEvening
FROM @t
WHERE --MondayMorning <> MondayEvening
--OR TuesdayMorning <> TuesdayEvening
MondayMorning <> MondayEvening
AND (MondayMorning != 0 and MondayEvening != 0)
OR TuesdayMorning <> TuesdayEvening
AND (TuesdayEvening != 0 and TuesdayMorning != 0)
4

1 に答える 1

1

SQL Server 2008+、VALUESサブクエリをエレガントに構築するために使用します。

Declare @t Table(Id int identity,[Date] Datetime,MondayMorning Int,MondayEvening Int,TuesdayMorning Int,TuesdayEvening Int)
Insert Into @t Select '2012-01-01',0,2,3,2

     SELECT t.Id, t.[Date],
            Case when MondayMorning=v.state then MondayMorning end MondayMorning,
            Case when MondayEvening=v.state then MondayEvening end MondayEvening,
            Case when TuesdayMorning=v.state then TuesdayMorning end TuesdayMorning,
            Case when TuesdayEvening=v.state then TuesdayEvening end TuesdayEvening
       FROM @t t
CROSS APPLY (select distinct State
               from (values(MondayMorning),
                           (MondayEvening),
                           (TuesdayMorning),
                           (TuesdayEvening)) v(state)) v(state)

SQL Server 2005では、VALUES()派生テーブルをSELECT .. UNION ALLに置き換えます。例:

CROSS APPLY (select distinct State
               from (SELECT MondayMorning UNION ALL
                     SELECT MondayEvening UNION ALL
                     SELECT TuesdayMorning UNION ALL
                     SELECT TuesdayEvening) v(state)) v(state)
于 2012-11-04T22:52:57.540 に答える