2010-09-15 248 views
2

我有这样一个名为“天”SQL脚本帮助

Day 1 Day 2 Day 3 Day 4 Day 5 Day 6 Day 7 
1  1  1  1  0  0  0 
1  1  1  1  0  0  0 

具有相应的细节的表格。其中1为'真'且0为假。

DaY 1 - sunday 
day 2- monday 
day 3 - tuesday 
day 4- wednesday 
day5 - thursday 
day 6 - friday 
dayy 7- saturday 

1 - denotes there is work on the given day 
0 - denotes there is no work on the given day. 

给出的细节上面,我需要做列表映射 和需要生成这样的,在这里我需要得到的数据表只有那些具有标志1

1 Sunday 
2 Monday 
3 Tuesday  
4 Wednesday 

为第一条记录。

+2

为什么'5星期四'? – 2010-09-15 11:44:38

+0

什么是你的表的主键? – 2010-09-15 11:46:56

+0

该表有Id,这是主键,不在表 – SRA 2010-09-15 12:12:05

回答

2

我相信你正在寻找的东西像下面这样:

select 
case when day1=1 then '1 Sunday' end Sunday, 
case when day2=1 then '2 Monday' end Monday, 
case when day3=1 then '3 Tuesday' end Tuesday, 
case when day4=1 then '4 Wednesday' end Wednesday, 
case when day5=1 then '5 Thursday' end Thursday, 
case when day6=1 then '6 Friday' end Friday, 
case when day7=1 then '7 Saturday' end Saturday 
from [table] 
where day1+day2+day3+day4+day5+day6+day7 <> 7 

或者那些应该是行?然后,你将需要unpivot源数据第一,像这样:

select  
cast(substring(dayname, 4, 1) as tinyint) as DayNumber, 
case cast(substring(dayname, 4, 1) as tinyint) 
when 1 then 'Sunday' 
when 2 then 'Monday' 
when 3 then 'Tuesday' 
when 4 then 'Wednesday' 
when 5 then 'Thursday' 
when 6 then 'Friday' 
when 7 then 'Saturday' end [DayName] 
, DayFlag 
from (select * from [table] t where day1+day2+day3+day4+day5+day6+day7 <> 7) f 
unpivot 
(
DayFlag for DayName in ([day1], [day2], [day3], [day4], [day5], [day6], [day7]) 
) unpvt 
where DayFlag = 1 --is this what you need? 
+0

嗨dennis谢谢你。我怎样才能在一个单独的列中获得日数? – SRA 2010-09-15 13:16:32

+0

@Sunil Ramu,'cast(substring(dayname,4,1)as tinyint)' – 2010-09-15 13:37:40

4
WITH [days] (id, day1, day2, day3, day4, day5, day6, day7) AS 
     (
     SELECT 1, 1, 1, 1, 1, 1, 0, 0 
     UNION ALL 
     SELECT 2, 1, 1, 1, 1, 1, 0, 0 
     ) 
SELECT id, DATENAME(dw, DATEADD(d, CAST(SUBSTRING(wd, 4, 1) AS INT), '2005-01-01')), work 
FROM [days] 
UNPIVOT 
     (
     work FOR wd IN 
     (day1, day2, day3, day4, day5, day6, day7) 
     ) AS up 
WHERE work = 1 
2

免责声明 - 我知道这并不解决您的问题,但它不会是最好有一个已被取消的表-normalized出来是这样的:

ID | WeekNo | DayNo 
---------------------- 
1  1   1 
2  1   2 
3  1   3 
4  2   6 
5  2   7 

因此,你实际上只增加天到工作在那一天进行的表(即有1周,只有工作进行了4-7天没有工作在第2周的第6天和第7天)。然后,你可以在你的.net应用程序中拥有一些逻辑,它能够“知道”本周的完整天数,并向你展示一个例外列表(即,对于任何给定的WeekNo而言,这些天不在表中)

这将是我对这场“辩论”的第一个备选想法......

+0

同意,结构是错误的,需要在做任何事之前先修复。 – HLGEM 2010-09-15 13:44:55

+0

@HLGEM我不知道。正常化在这里真的有必要吗?我越想越多,我越不喜欢意大利面条表。把它想成面具。我会在那里放置一个varchar(7)面具,并完成它,但如果它需要索引然后雅,这是好的,因为它是。 – 2010-09-15 13:45:23