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。非常感谢。