将多个SQL行/列组合成一行

时间:2014-09-23 20:02:09

标签: sql sql-server tsql

我目前正在尝试将一系列行转换为一行,以便数据可以显示在报告上。

我的数据显示在我的表CustomData中,如下所示:

CustomDataID(PK) CustomDataDefinition   ReferenceTablePKValue   IntValue    DateTimeValue   StringValue
1                      Number                   1638              1230          NULL           NULL
2                     1stDate                   1638              NULL       2014-09-23        NULL
3                     2ndDate                   1638              NULL       2014-09-25        NULL
4                     3rdDate                   1638              NULL       2014-09-25        NULL
5                      Notes                    1638              NULL          NULL         Test note.

我的目标是拥有这样的东西。基本上我需要它把它作为一行。

Number   1stDate       2ndDate     3rdDate       Notes
1230    2014-09-23   2014-09-25   2014-09-25   Test note.

我尝试过使用多个SELECT的各种JOINs语句,但这些语句根本没有效果。我认为可能有一个临时表可以工作,但我真的不太熟悉它是如何工作的。有没有人对如何适当地转换这些数据有任何想法?如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

由于有不同的类型,您无法在此处使用数据透视,因此您可以使用数据透视功能之前的功能:

with t(CustomDataID, CustomDataDefinition, ReferenceTablePKValue
       , IntValue, DateTimeValue, StringValue) as (
  select 1, 'Number', 1638, 1230, NULL, NULL union all
  select 2, '1stDate', 1638, NULL, '2014-09-23', NULL union all
  select 3, '2ndDate', 1638, NULL, '2014-09-25', NULL union all
  select 4, '3rdDate', 1638, NULL, '2014-09-25', NULL union all
  select 5, 'Notes', 1638, NULL, NULL, 'Test note'
)
select ReferenceTablePKValue
     , max(case 
             when CustomDataDefinition = 'Number' then intvalue 
           end) "number"
     , max(case 
             when CustomDataDefinition = '1stDate' then datetimevalue
           end) "1stDate"
     , max(case 
             when CustomDataDefinition = '2ndDate' then datetimevalue
           end) "2ndDate"
     , max(case 
             when CustomDataDefinition = '3rdDate' then datetimevalue
           end) "3rdDate"
     , max(case 
             when CustomDataDefinition = 'Notes' then stringvalue
           end) "Notes"
  from t
 group by ReferenceTablePKValue

REFERENCETABLEPKVALUE   NUMBER   1STDATE     2NDDATE     3RDDATE    NOTES
-----------------------------------------------------------------------------
                 1638     1230  2014-09-23  2014-09-25  2014-09-25  Test note

SQLFiddle

答案 1 :(得分:0)

取决于你想要做多少行,简单的方法来准确地返回你正在寻找的是使用case语句,如果你试图为一堆不同的变量做这个,然后做一个cse的bunnch声明并不好玩,此时我会考虑转动数据。

select
case when CustomDataDefinition = 'Number' then intvalue end 'Number',
case when CustomDataDefinition = '1stDate' then datetimevalue end '1stDate',
case when CustomDataDefinition = '2ndDate' then datetimevalue end '2ndDate',
case when CustomDataDefinition = '3rdDate' then datetimevalue end '3rdDate',
case when CustomDataDefinition = 'Notes' then stringvalue end 'Notes'



from
*yourtable*