【问题标题】:SQL Union Or Join HorizantallySQL联合或水平连接
【发布时间】:2014-12-08 11:46:35
【问题描述】:

我正在尝试将以下查询放入查询中的一行。下面只是一个例子,我有大约 10 个计数组合成一行

select ISNULL(COUNT(*),0) as ENGLAND from Service_User s 
where s.commissioner_id ='1'

select ISNULL(COUNT(*),0) as WALES from Service_User s 
where s.commissioner_id ='2'

select ISNULL(COUNT(*),0) as GERMANY from Service_User s 
where s.commissioner_id ='3'

我尝试将它们合并,但它们垂直显示,我希望它们水平显示。

我希望它如下所示

【问题讨论】:

  • 你不必使用ISNULL(COUNT(*),0),如果没有找到记录,COUNT(*) 将返回 0...

标签: sql-server join count union


【解决方案1】:

试试这个。使用Sub-select

SELECT (SELECT Isnull(Count(*), 0)
        FROM   Service_User s
        WHERE  s.commissioner_id = '1') AS ENGLAND,
       (SELECT Isnull(Count(*), 0)
        FROM   Service_User s
        WHERE  s.commissioner_id = '2') AS WALES,
       (SELECT Isnull(Count(*), 0)
        FROM   Service_User s
        WHERE  s.commissioner_id = '3') AS GERMANY 

【讨论】:

  • 谢谢,完成了这项工作
  • 我想,这个查询会慢很多。
【解决方案2】:

如果您使用的是 Sql Server 2012 或更高版本,那么它可以更短。

试试这个,

;With CTE As

(
select commissioner_id, ROW_NUMBER()Over(Partition By commissioner_id order by commissioner_id) RowNum  from Service_User s 
 s.commissioner_id  in(1,2,3)

)
,CTE1 as
(
 Select commissioner_id,MAX(RowNum) from CTE
 group By commissioner_id
)

select * from CTE
--pivot this result set

【讨论】:

    【解决方案3】:

    如果我知道我的commissioner_id 没有改变,我可以将值加载到查询中,我会选择选项1。

    SELECT * FROM (select COUNT(*) As Count,(select case commissioner_id when '01' then 'England' when '02' then 'Wales' when '03' then 'Germany' else 'Other') as [Location] from Service_User group by [Location]) as s PIVOT (SUM(count) FOR [Location] IN ("England","Wales","Germany","Other")) AS PivotOut

    第二个选项我将创建一个存储过程,该过程动态加载commissioner_id 的选项,然后进行旋转。这样,在添加了commissioner_ids 后,无需人工干预即可返回所需的结果。

    Create PROCEDURE [dbo].[DynamicSP]
    AS
    BEGIN
        declare @sql as varchar(max)
        declare @dynamic varchar(max)
    
        select @dynamic=COALESCE(@dynamic +',','')+commissioner_id
        FROM 
        (select distinct commissioner_id from Service_User) as CommIds order by commissioner_id
    
        set @SQL = '(select COUNT(*) As count,commissioner_id as [Location] from Service_User group by [Location]) as s PIVOT (SUM(count) FOR [Location] IN (' + @dynamic + ')) AS PivotOut'
    
        exec(@sql)
    END

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多