2012-11-08 190 views
0

我有以下的数据库方案:SQL查询来汇总计算日期

相关信息(ID:INT,日期:日期,PROVIDER_ID:INT)

提供商(ID:INT,类型:int,名称: varchar)

在任何给定的日期,我允许多达5个不同类型的提供者。我想要的是这样的:

DATE | provider.name与类型= 0 | .... | ... | PROVIDER.name与类型= 4 |

如果在指定日期没有正确类型的提供者,那么应该有一个空值。

我很努力地正确地获得此设置,并希望避免在稍后在我的php程序中执行此操作(如循环遍历所有结果,然后将它们聚合在一起,这可能但看起来很丑)。

我正在使用MySQL btw。

+2

如果这些表包含给定'(日期,类型)'对的多个记录会怎么样? – eggyal

回答

0

你想这样做一个简单的连接和聚合:

select i.date, 
     max(case when p.type = 1 then p.name end) as Type1, 
     max(case when p.type = 2 then p.name end) as Type2, 
     max(case when p.type = 3 then p.name end) as Type3, 
     max(case when p.type = 4 then p.name end) as Type4 
from infos i left outer join 
    provider p 
    on i.provider_id = p.id 
group by i.date 
+0

按日期分组不能正确处理多个记录。它会在该日期选择符合该类型的第一个提供者。所以如果你有2个类型为4的供应商......我们如何保证我们想要的那个? – Shawn

+0

非常感谢,我现在试了几个多小时,似乎将来我必须更多地阅读SQL! – schneida

+0

@Shawn。 。 。首先,这个问题明确提出“5个不同类型的供应商”。其次,它没有说明应该选择哪一个,如果有多个没有。第三,所述语法返回最大值,而不是第一个值。 –

0

试试这个。 MySQL语法可能有点不同。

select 
(select convert(varchar,infos.date) + provider.name + 'with type = 0' 
infos LEFT JOIN provider 
on infos.id = provide.id 
and provider.type = 0 and infos.date= inputdate) + 
(select provider.name + 'with type = 1' 
infos LEFT JOIN provider 
on infos.id = provide.id 
and provider.type = 1 and infos.date= inputdate) + 
(select provider.name + 'with type = 2' 
infos LEFT JOIN provider 
on infos.id = provide.id 
and provider.type = 2 and infos.date= inputdate) + 
(select provider.name + 'with type = 3' 
infos LEFT JOIN provider 
on infos.id = provide.id 
and provider.type = 3 and infos.date= inputdate) + 
(select provider.name + 'with type = 4' 
infos LEFT JOIN provider 
on infos.id = provide.id 
and provider.type = 4 and infos.date= inputdate) 
0

没有使用MySQL,但在TSQL我会做水木清华这样的:

select 
    date, type_0, ..., type_n 
from 
(
    select 
    i.date, p.type, p.name 
    from infos i 
    left join provider p on 
    i.provider_id = p.id 
) as source 
pivot 
(
    min(source.name) 
    for source.type in (0, 1, ..., n) 
) as pivotTable 
0

老实说,PHP是你最好的选择,因为你必须处理所有的情况。每个提供者可以有多行,或者如果只有一个提供者,那么你可以有许多匹配的日期和类型。 PHP格式:

for($i=0; i<5; $i++) 
{ 
    $list[] = $query->execute("SELECT name FROM query_here WHERE type=$i"); 
} 

现在你可以使用该数组来显示你需要的数据。