SQL Server有没有办法绕过重复的条件行

标签 sql sql-server-2008

您好,我正在尝试清理一个查询,其中一行重复了六次。 有没有办法在 SQL 中设置类似常量的东西?

这是问题的一个例子:

select Distinct DSF.CityName, 
( Select count (Distinct DSF1.IncdtKey)
  from dbo.IncidentFile DSF1 
  Where DSF1.IncidentMostSevere in ('1', '2', '4', '5', '6')
  and DSF1.CategoryKey in ('15', '01', '02', '03', '04', '05', '06')<-----
  and DSF1.CityName = DSF.CityName)  as 'Weapons Possession 11-12',
( Select count (Distinct DSF2.IncdtKey)
  from dbo.IncidentFile DSF2 
  Where DSF2.IncidentMostSevere in ('7', '8', '9', '10', '11', '12')
  and DSF2.CategoryKey in ('15', '01', '02', '03', '04', '05', '06') <-----
  and DSF2.CityName = DSF.CityName)  as 'Drugs Related 11-12',
( Select count (Distinct DSF3.IncdtKey)
  from dbo.IncidentFile DSF3 
  Where DSF3.IncidentMostSevere in ('14', '15', '17', '20', '21', '22', '26') 
  and DSF3.CategoryKey in ('15', '01', '02', '03', '04', '05', '06') <-----
  and DSF3.CityName = DSF.CityName)  as 'Incident with Injury 11-12',
( Select count (Distinct DSF4.IncdtKey)
  from dbo.IncidentFile DSF4 
  Where DSF4.IncidentMostSevere in ('16', '18', '19', '23', '24', '25')
  and DSF4.CategoryKey in ('15', '01', '02', '03', '04', '05', '06') <-----
  and DSF4.CityName = DSF.CityName)  as 'Incident no Injury 11-12',
( Select count (Distinct DSF5.IncdtKey)
  from dbo.IncidentFile DSF5 
  Where DSF5.IncidentMostSevere in ('3', '13', '29', '31', '32', '33')
 and DSF5.CategoryKey in ('15', '01', '02', '03', '04', '05', '06') <-----
 and DSF5.CityName = DSF.CityName)  as 'Other reason for 11-12',
( Select count (Distinct DSF6.IncdtKey)
  from dbo.IncidentFile DSF6 
  Where DSF6.CategoryKey in ('15', '01', '02', '03', '04', '05', '06') <-----
  and DSF6.CityName = DSF.CityName)  as 'Total Incidents'
  from dbo.IncidentFile DSF
group by DSF.CityName
Order by DSF.CityName

谢谢

最佳答案

您应该能够使用 CTE,然后使用带有 CASE 表达式的聚合函数:

;with cte as
(
  select distinct CityName,
    IncidentMostSevere,
     IncdtKey
  from dbo.IncidentFile
  where CategoryKey in ('15', '01', '02', '03', '04', '05', '06')
)
select CityName,
  count(case 
        when IncidentMostSevere in ('1', '2', '4', '5', '6')
        then IncdtKey end) as 'Weapons Possession 11-12',
  count(case 
        when IncidentMostSevere in ('7', '8', '9', '10', '11', '12')
        then IncdtKey end) as 'Drugs Related 11-12',
  count(case 
        when IncidentMostSevere in ('14', '15', '17', '20', '21', '22', '26')
        then IncdtKey end) as 'Incident with Injury 11-12',
  count(case 
        when IncidentMostSevere in ('16', '18', '19', '23', '24', '25')
        then IncdtKey end) as 'Incident no Injury 11-12',
  count(case 
        when IncidentMostSevere in ('3', '13', '29', '31', '32', '33')
        then IncdtKey end) as 'Other reason for 11-12',
  count(case 
        when IncidentMostSevere in ('15', '01', '02', '03', '04', '05', '06')
        then IncdtKey end) as 'Total Incidents'
from cte
group by CityName
order by CityName

关于SQL Server有没有办法绕过重复的条件行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16071993/

相关文章:

android - SQLite Database for Android 应用强制关闭

sql - 只打印列中的最大值

sql-server - 如何在sql server 2008中使用插入后触发器

sql - SQL 2008 r2 有刷新存储过程的热键吗?

sql - 使用CTE和行号作为序列进行更新,或者使用ROW_NUMBER()进行TSQL更新查询

sql - 如何将数据从 Postgres 移动到在 Amazon 的 RDS 上运行的 MySQL?

Mysql搜索每个单词

sql - 长期使用 Oracle 的用户切换到 MySQL,有什么需要注意的问题吗?

sql-server - 在 SQL Server 2008 中实现行级安全性

ruby-on-rails - Ruby on Rails 和 MS SQL EXPRESS