0

这就是我想做的。我有 3 张表:工作场所、详细信息和停机时间。到目前为止,我从 Workplace 表中选择了工作场所的编号(并从 Details 表中添加了它的名称)、发出通知的日期、班次和 Downtime 表中的停机时间总和 Now... 在 Downtime 表中是带有停机时间代码的列。每个通知都有一个代码和分钟数。我想要做的......也有与代码一样多的列......这是我的查询现在向我显示的内容:

|Workplace|Date       |Shift|Downtime|
|1345     |2012-08-28 |1    |100     |
|1346     |2012-08-28 |1    |130     |
|1347     |2012-08-28 |1    |40      |

我在停机时间表中有停机时间代码及其报告的分钟数......我希望它类似于:

|Workplace|Date       |Shift|Code 1|Code 3|Code 4|Code 6|
|1345     |2012-08-28 |1    |100   |30    |10    | 5    |
|1346     |2012-08-28 |1    |130   |30    |10    | 5    |
|1347     |2012-08-28 |1    |40    |30    |10    | 5    |

我怎么能做这样的事情?谢谢!

4

4 回答 4

2

那么 - 您想将停机时间分解为用于它的代码吗?您应该能够使用 case 语句来做到这一点:

SELECT Workplace, Date, Shift, SUM(CASE WHEN Code = Code1 then Downtime ELSE 0) as Code1, SUM(CASE WHEN Code = Code2 then Downtime ELSE 0) as Code2,等等。

于 2012-08-28T18:14:45.890 回答
1

我的快速回答是您可以使用游标和动态查询。

游标示例: http ://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/

动态查询示例: http ://www.techrepublic.com/blog/datacenter/generate-dynamic-sql-statements-in-sql-server/306

祝你好运。

于 2012-08-28T17:46:04.737 回答
1

好的,从您的回复中,我建议您拥有大部分代码,因此最终大致如下:

select 
 tablea.workplace, 
 tablea.date, 
 tablea.shift, 
 sum(downtimemins),
 tableb.code1,
 tableb.code3, 
 tableb.code4, 
 tableb.code6 
from tablea 
left join downtime on 
 tablea.workplace=tableb.workplace and 
 tablea.date=tableb.date and 
 tablea.shift=tableb.shift 
group by tablea.workplace, tablea.date, tablea.shift
于 2012-08-28T18:04:38.530 回答
0

您需要的基本上是 SQL 2005 标准中引入的 PIVOT 子句。AFAIK Microsoft SQL Server 和 Oracle 确实支持 PIVOT 子句。postgresql 有第三方解决方案,但我不知道其他 RDBMS。

因此,取决于您使用的数据库:您不能或可以(使用 PIVOT)。

于 2012-08-28T18:30:29.220 回答