Sql 如何查询将数据用作列名/字段名的表
假设我有这张桌子:Sql 如何查询将数据用作列名/字段名的表,sql,sql-server,pivot,Sql,Sql Server,Pivot,假设我有这张桌子: Day AMFrom AMTo PMfrom PMTo -------------------------------------------------------------------- Monday 09:00 Null Null 06:00 Tuesday 09:00 Null Null 06:00 Wednesday 09
Day AMFrom AMTo PMfrom PMTo
--------------------------------------------------------------------
Monday 09:00 Null Null 06:00
Tuesday 09:00 Null Null 06:00
Wednesday 09:00 Null Null 06:00
Thursday 09:00 Null Null 06:00
Friday 09:00 Null Null 06:00
Saturday 08:00 Null Null 05:00
Friday 08:00 Null Null 06:00
如何查询此表以获得此类输出:
MondayAMFrom MondayAMTo MondayPMFrom MondayPMTo
--------------------------------------------------------------------------
09:00 NULL Null 06:00
输出还包括TuesdayAMFrom、TuesdayPMto等,。。。。。。。。。。SundayPMTo.
试试这个
DECLARE @sql AS varchar(max)
DECLARE @Day AS varchar(max)
SET @Day = 'Monday'
SET @sql = 'SELECT AMFrom As ' + @Day + 'AMFrom,
AMTo As ' + @Day + 'AMTo,
PMFrom As '+ @Day + 'PMFrom,
PMTo As ' + @Day + 'PMTo
FROM Table1
WHERE Day = ''' + @Day+ ''''
Exec(@sql)
试试这个
DECLARE @sql AS varchar(max)
DECLARE @Day AS varchar(max)
SET @Day = 'Monday'
SET @sql = 'SELECT AMFrom As ' + @Day + 'AMFrom,
AMTo As ' + @Day + 'AMTo,
PMFrom As '+ @Day + 'PMFrom,
PMTo As ' + @Day + 'PMTo
FROM Table1
WHERE Day = ''' + @Day+ ''''
Exec(@sql)
为了简洁起见,我简化了模式,但它也可以应用于您的模式:
create table tbl(day varchar(20), amfrom int, amto int);
insert into tbl values ('Monday', 9, null);
insert into tbl values ('Tuesday', 10, 11);
select
MondayAmFrom,
MondayAmTo,
TuesdayAmFrom,
TuesdayAmTo
from
(
select
amfrom as MondayAmFrom,
amto as MondayAmTo
from tbl where day = 'Monday'
) as mon
,
(
select
amfrom as TuesdayAmFrom,
amto as TuesdayAmTo
from tbl where day = 'Tuesday'
) as tue;
这是输出:
MONDAYAMFROM MONDAYAMTO TUESDAYAMFROM TUESDAYAMTO
9 (null) 10 11
我们每天都创建子查询。然后我们把他们加入主桌。一周中的几天需要知道,在您的示例中就是这样。只有7个
选择case when then
在此处不起作用,因为它将创建7行,并且很难对它们进行分组。分组的问题是您的模式支持空值
为了简洁起见,我简化了模式,但它也可以应用于您的模式:
create table tbl(day varchar(20), amfrom int, amto int);
insert into tbl values ('Monday', 9, null);
insert into tbl values ('Tuesday', 10, 11);
select
MondayAmFrom,
MondayAmTo,
TuesdayAmFrom,
TuesdayAmTo
from
(
select
amfrom as MondayAmFrom,
amto as MondayAmTo
from tbl where day = 'Monday'
) as mon
,
(
select
amfrom as TuesdayAmFrom,
amto as TuesdayAmTo
from tbl where day = 'Tuesday'
) as tue;
这是输出:
MONDAYAMFROM MONDAYAMTO TUESDAYAMFROM TUESDAYAMTO
9 (null) 10 11
我们每天都创建子查询。然后我们把他们加入主桌。一周中的几天需要知道,在您的示例中就是这样。只有7个
选择case when then
在此处不起作用,因为它将创建7行,并且很难对它们进行分组。分组的问题是您的模式支持空值
感谢您编辑vignesh。感谢您编辑vignesh。我正在考虑使用pivot。但这让我感兴趣。我一定会试试这个。谢谢。问题是它只在星期一有效,但在问题中,星期二也需要在同一张表中。事实上,博拉特,在我发布它的时候,我不知道如何做到这一点。我试着搜索网络,发现了pivot。现在我看到了维尼什的方法,我现在可以有一个强有力的方法,我相信。@Borat Sagdiev如果它只显示一周中的一天怎么会好呢?@evpo-我会收回这一点。我以为他只想在星期一回答他的问题。是的,Vignesh的回答在这里没有帮助。我错误地认为他的方法可以在其他日子重复。我正在考虑使用pivot。但这让我感兴趣。我一定会试试这个。谢谢。问题是它只在星期一有效,但在问题中,星期二也需要在同一张表中。事实上,博拉特,在我发布它的时候,我不知道如何做到这一点。我试着搜索网络,发现了pivot。现在我看到了维尼什的方法,我现在可以有一个强有力的方法,我相信。@Borat Sagdiev如果它只显示一周中的一天怎么会好呢?@evpo-我会收回这一点。我以为他只想在星期一回答他的问题。是的,Vignesh的回答在这里没有帮助。我错误地认为他的方法可以在其他日子重复。我喜欢你(Evpo)和Vignesh的方法,但根据我的问题,包括其他日子,如周二、周三等,我更喜欢你的方法Evpo。谢谢。我喜欢你们(Evpo)和维格内什的方法,但根据我的问题,包括周二、周三等其他日子,我更喜欢你们的方法Evpo。非常感谢。