我有一个下表(一个简化的例子,实际上该表包含多个ID,日期变量可变,每个日期的事件数可变):
IDs Date Event
102 1996-10-16 00:00:00 A
102 1996-10-23 00:00:00 A
102 1996-10-23 00:00:00 B
102 1997-01-14 00:00:00 A
103 1997-01-14 00:00:00 D
103 1997-01-15 00:00:00 A
103 1997-01-16 00:00:00 A
103 1997-01-16 00:00:00 B
103 1997-01-16 00:00:00 C
我正在尝试获取一个表格,其中我将具有不同的ID /日期对,其中已记录多个事件的行被转换为列。所以,我正在寻找一个表格,对于这个例子看起来像这样:
IDs Date Event Event2 Event3
102 1996-10-16 00:00:00 A NULL NULL
102 1996-10-23 00:00:00 A B NULL
102 1997-01-14 00:00:00 A NULL NULL
103 1997-01-14 00:00:00 D NULL NULL
103 1997-01-15 00:00:00 A NULL NULL
103 1997-01-16 00:00:00 A B C
我很抱歉没有发布任何代码,但坦率地说,我甚至不知道如何从这开始。
答案 0 :(得分:4)
有关PIVOT方法的详细信息。
和有用的答案:
Using PIVOT in SQL Server 2008
MSSQL dynamic pivot column values to column header
试试这段代码:
-- Temporary table...
create table ##myTable (
IDs int
,[Date] datetime
,[Event] varchar(1)
)
-- ... with sample data
insert ##myTable
select 102, '2010-01-01', 'A'
union select 102, '2010-01-01', 'B'
union select 102, '2010-01-01', 'C'
union select 102, '2010-01-01', 'E'
union select 103, '2010-01-01', 'A'
union select 104, '2010-01-01', 'B'
union select 104, '2010-01-01', 'C'
union select 105, '2010-01-01', 'F'
-- Variables
DECLARE @cols AS NVARCHAR(MAX)
,@query AS NVARCHAR(MAX)
-- Build column name for our result.
-- The ROW_NUMBER() operator gives us the rank of the event for
-- the combination of IDs and Date. With that, event B for IDs 104
-- will have rank 1, and then will appear in the 1st column.
SELECT @cols = STUFF(
(SELECT DISTINCT
',' + QUOTENAME('Event' + LTRIM(STR(
ROW_NUMBER() OVER (
PARTITION BY IDs, [Date]
ORDER BY IDs, [Date]
)
)))
FROM ##myTable
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
, 1, 1, '')
set @query = '
SELECT IDs, [Date], ' + @cols + '
FROM (
SELECT IDs
,[Date]
,[Event]
,''Event'' + LTRIM(STR(
ROW_NUMBER() OVER (
PARTITION BY IDs, [Date]
ORDER BY IDs, [Date]
)
)) as [EventNo]
FROM ##myTable
) x
PIVOT
(
MAX([Event])
FOR [EventNo] IN (' + @cols + ')
) p'
execute sp_executesql @query
-- Remove temporary table
drop table ##myTable
结果:
答案 1 :(得分:1)
如果您只有两个事件,则可以使用min()
,max()
和其他一些逻辑执行此操作:
select ids, date, min(event) as event,
(case when min(event) <> max(event) then max(event) end) as event2
from table t
group by ids, date;
这是标准的SQL,因此它应该适用于任何数据库。
答案 2 :(得分:0)
首先尝试选择ID,然后根据上面的id ....
获取所有列<?php
$query = $database->getRows("SELECT DISTINCT ids FROM table");
?>
<table>
<?php foreach($query as $row){ ?>
<tr>
<td><?php echo $row['ids']; ?></td>
<?php
$id= $row["ids"];
$sub_inner = $database->getRows("SELECT date,Event,Event2 FROM table where ids= :ids",
array(':ids'=>$id));
?>
<td><?php foreach($sub_inner as $list){ ?><?php echo $list['date']; ?></td><td><?php echo $list['Event']; ?><?php } ?></td>
<td><?php echo $list['Event2']; ?></td>
<?php } ?>