SQL Server Pivot用于计数联接表中的实例

格林维尔

我有3张桌子;类别,位置和业务。

类别和位置表仅具有一个ID和一个名称。

每个业务记录都有一个categoryID,一个locationID和一个名称字段。

我想构建一个表格,以表格形式显示每个位置和类别组合中的商家数量。因此,将类别作为列,将位置作为行,将计数作为单元格数据。

具有总计列和行也将是惊人的。

我知道我应该能够使用数据透视表执行此操作,但是我无法理解数据透视表的语法。

任何帮助将非常感激。

谢谢,

缺口

编辑:这是我的表的JS小提琴;http://sqlfiddle.com/#!2/4d6d2/1

所需的输出:

            | Activities  | Bars     | Sweet shops   | Total
Chester     | 1           | 0        | 0             | 1
Frodsham    | 0           | 2        | 0             | 2
Stockport   | 1           | 0        | 1             | 2
Total       | 2           | 2        | 1             | 5
塔林

要获得所需的最终结果,可以使用PIVOT函数。首先,我将从返回所有数据的子查询开始,再给您每个位置的每个活动的总计:

select l.name location,
  c.name category,
  count(b.locationid) over(partition by b.locationid) total
from location l
left join business b
  on l.id = b.locationid
left join category c
  on b.categoryid = c.id;

请参见带有演示的SQL Fiddle使用窗口功能可count() over()创建每个位置的活动总数。一旦有了这些,就可以透视数据以将类别转换为列:

select 
  isnull(location, 'Total') Location, 
  sum([Activities]) Activities, 
  sum([Bars]) bars, 
  sum([Sweet Shops]) SweetShops,
  sum(tot) total
from
(
  select l.name location,
    c.name category,
    count(b.locationid) over(partition by b.locationid) tot
  from location l
  left join business b
    on l.id = b.locationid
  left join category c
    on b.categoryid = c.id
) d
pivot
(
  count(category)
  for category in ([Activities], [Bars], [Sweet Shops])
) piv
group by grouping sets(location, ());

请参见带有演示的SQL Fiddle我还实现GROUPING SETS()了使用每个活动的总计创建最后一行的方法。

如果活动数量有限,但是上面的方法非常有用,但是如果您的活动未知,那么您将要使用动态SQL:

DECLARE 
    @cols AS NVARCHAR(MAX),
    @colsgroup AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(name) 
                    from dbo.category
                    group by id, name
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsgroup = STUFF((SELECT ', sum(' + QUOTENAME(name)+ ') as '+ QUOTENAME(name)
                    from dbo.category
                    group by id, name
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



set @query = N'SELECT 
                Isnull(location, ''Total'') Location, '+ @colsgroup + ', sum(Total) as Total
            from 
            (
              select l.name location,
                c.name category,
                count(b.locationid) over(partition by b.locationid) total
              from location l
              left join business b
                on l.id = b.locationid
              left join category c
                on b.categoryid = c.id
            ) x
            pivot 
            (
                count(category)
                for category in ('+@cols+')
            ) p 
            group by grouping sets(location, ());'

exec sp_executesql @query;

请参见带有演示的SQL Fiddle这两个版本都给出结果:

|  LOCATION | ACTIVITIES | BARS | SWEET SHOPS | TOTAL |
|-----------|------------|------|-------------|-------|
|   Chester |          1 |    0 |           0 |     1 |
|  Frodsham |          0 |    1 |           0 |     1 |
| Stockport |          1 |    0 |           1 |     2 |
|     Total |          2 |    1 |           1 |     4 |

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从表SQL Server中的每个列获取每个值的计数

来自分类Dev

SQL Server创建视图并联接表

来自分类Dev

在SQL Server中联接2个表

来自分类Dev

SQL Server多表联接

来自分类Dev

SQL Server中的条件表联接

来自分类Dev

在SQL Server中联接多个表

来自分类Dev

SQL Server:从联接的表中更新多个记录

来自分类Dev

从联接SQL Server创建表

来自分类Dev

SQL Server:联接三个表

来自分类Dev

联接表中子查询中的SQL Server 2012最大日期

来自分类Dev

SQL Server 2012:如何从多个表联接中获取计数组

来自分类Dev

SQL Server跨表联接

来自分类Dev

以最优化的方式从sql server表中获取记录计数

来自分类Dev

SQL Server Pivot语法

来自分类Dev

在SQL Server中联接2个表

来自分类Dev

如何获取SQL Server中的联接表的计数?

来自分类Dev

SQL Server跨多个表联接

来自分类Dev

SQL Server:从联接的表中更新多个记录

来自分类Dev

SQL Server 2008联接类型用于4个表

来自分类Dev

SQL Server Pivot In子句

来自分类Dev

自联接SQL Server 2008中的表

来自分类Dev

sql server,表中许多列上的聚合(计数)

来自分类Dev

在SQL Server中创建联接表

来自分类Dev

基于查询表的SQL Server内部联接

来自分类Dev

SQL Server 2008查询-表联接

来自分类Dev

SQL Server左联接与3个表

来自分类Dev

需要在 SQL Server 中的表上创建 Pivot

来自分类Dev

Sql Server 中的自联接+左联接

来自分类Dev

SQL Server 联接表和总和表