如何在没有列的SQL中进行PIVOT操作?

时间:2014-04-12 01:02:02

标签: sql sql-server

这是我的查询

  SELECT 
  Count(case when IPAddress0 like '10.172.%' then 1 else null end) as HW
 ,Count(case when DNSHostName0 like '50%' then 1 else null end) as HN
  From v_Network_DATA_Serialized

(大约50多个" Count' s",所以代替50个colums,id就像他们每个都显示为一行。

我尝试了一些PIVOT'但通常错误的列[HW]上的错误不包含在PIVOT中。

有更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

我会在表v_Network_DATA_Serialized中添加一列,指示相关聚合的名称。让我们说,例如,“agg_alias”。

然后,更新现有记录,使其包含正确的别名。作为两个示例,给出您的示例数据:

update v_Network_DATA_Serialized set agg_alias = 'HW' where IPAddress0 like '10.172.%';
update v_Network_DATA_Serialized set agg_alias = 'HN' where DNSHostName0 like '50%';

这将为这两个计数记录现有记录的正确别名。要持续执行此操作,您可以每次输入数据,或通过触发器自动填充数据。 (取决于表格的填充方式)。你可以添加一个触发器来总是用给定其他值的正确别名填充列,对于你将要做的所有50个左右的计数。

之后,执行此查询将非常简单:

select      agg_alias
            , count(*)
from        v_Network_DATA_Serialized
group by    agg_alias

作为替代方法,您可以在50个联合中的一个查询中计算每个计数,例如

select count(*) as counter, 'HW' as agg_alias
  from v_Network_DATA_Serialize
 where IPAddress0 like '10.172.%'
union all
select count(*) as counter, 'HN' as agg_alias
  from v_Network_DATA_Serialized
 where DNSHostName0 like '50%'

(对于您给出的2个示例计数)。但我会以第一种方式做到这一点。

答案 1 :(得分:0)

尝试UNPIVOT

SELECT CountType, MyCounts
FROM
  (SELECT 
    Count(case when IPAddress0 like '10.172.%' then 1 else null end) as HW
    ,Count(case when DNSHostName0 like '50%' then 1 else null end) as HN
  FROM v_Network_DATA_Serialized) p
UNPIVOT
  (MyCounts FOR CountType IN
    (HW, HN)
) as up;