SQL Select,以小时为行,各个区域为列

时间:2018-06-24 02:20:15

标签: sql sql-server dynamic-sql

我有一个需要帮助的查询:

Select convert(char(2), IncTime, 108)  AS Hours, ISNULL(COUNT(IncNo),0) as 'Zone1'
From tblClosedCases
where IncDate between '01/01/2017' and '01/07/2017' and Zone = 'Zone1'
Group by convert(char(2), IncTime, 108)

tblClosedCases当然包含我用作行的内容。 tblClosedCases也有一个区域。我正在使用的当前DB的值分别为Zone1,Zone2,Zone3,Zone4。

用户可以将字段“区域”值更改为Z1到ABC123之间的任何值,并且可以从2个区域变化到20个区域。

是否有一种创建选择查询的方法,无论字段值或字段数如何,我都会以列名作为客户输入的值来得到类似的结果?

Hours   Zone1   Zone2   Zone3
00       22      5       15
01       34      21      14
02       41      9       9

我知道您需要更多信息,但我不确定还有什么。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

(应该是评论,但我的声誉不足以发表评论)

您在下面引用的语句是什么意思-在您的示例中Z1到ABC123在哪里适合,这些区域名称是什么?不同的表将具有不同名称的列数吗?如果是这样,则需要动态sql,这与所使用的数据库引擎无关。

您在数据透视查询中要做的事情的核心,而典型的实现方式就像

sum(case when zone='Zone 1' then Incno else 0 end) as 'Zone 1', 
sum(case when zone='Zone 2' then Incno else 0 end) as 'Zone 2'. . . 
 sum(case when zone='Zone N' then Incno else 0 end) as 'Zone N',

使用如显示的分组。但这取决于知道列的名称以及编写查询时有多少列。

  

用户可以将字段“区域”值更改为Z1到ABC123之间的任何值,并且可以从2个区域变化到20个区域。

如果您将在单个代码块中具有不同的列,则它将是动态sql,并且应为数据库产品添加标签“ dynamic-sql”和标签