首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL脚本帮助

SQL脚本帮助
EN

Stack Overflow用户
提问于 2010-09-15 19:41:01
回答 3查看 71关注 0票数 2

我有一个这样的表,名为"Days“

代码语言:javascript
复制
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为'true‘,0为false。

代码语言:javascript
复制
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的数据

代码语言:javascript
复制
1   Sunday 
2   Monday 
3   Tuesday     
4   Wednesday

对于第一个记录。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-15 19:50:55

我相信您正在寻找类似以下内容的内容:

代码语言:javascript
复制
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操作,如下所示:

代码语言:javascript
复制
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?
票数 2
EN

Stack Overflow用户

发布于 2010-09-15 19:52:38

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2010-09-15 20:09:58

免责声明-我知道它不能解决您的问题,但是有一个非规范化的表不是更好吗?

代码语言:javascript
复制
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,表中没有的日期)

这将是我对这场“辩论”的第一个替代想法…

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3717223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档