2012-11-04 38 views
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 

我想分裂记录1在两个记录,因为mondaymorning和mondayevening的状态是不一样的。如果国家是相同的,那么什么都不做。

,我希望得到的结果:

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 

请记住,还有其他的日子可能会有所不同。

我已经有一个查询,但是,neem有些变化。请参阅 SQL Fiddle上的查询。 您可以在这里看到的输出是出错的情况。对于TuesdayEvening和MondayEvening我期待2.

在SQL小提琴的信息是:

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) 
+0

会发生什么,例如,如果MM = ME和TM <> TE并且WM = WE和DM <> DE – bummi

+1

为什么您认为替代数据结构更可取?为什么不按照列ID,参考日期,星期几,AM或PM以及价值进行标准化?普遍认为即使只是周三上午和下午也要处理挫折和指数(或者因子)增长。上周日上午和下午不会考虑。 –

+0

@bummi,[link](http://sqlfiddle.com/#!3/d41d8/5714)查看预期结果。它正在工作,但是在Mornings = 0和Evenings> 0的情况下,它会出错。 – Ahmet

回答

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中,用SELECT ... UNION更换VALUES()派生表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) 
+0

是否还有从时段到天?像:周一上午和周一晚上到周一? – Ahmet

+0

这是一个新的要求/问题吗?我不会从你的问题文本中推断出来。 – RichardTheKiwi

+0

我将在稍后将此作为新问题发布。 – Ahmet

相关问题