2015-03-31 62 views
0

我有一个有趣的需求,即使用不同的条件对数据集进行分区。按多个条件对数据集进行分区TSQL

说,这不是简单的GROUP BYORDER BY我不得不说起初的地方。

这是排名吗?是更接近一点,但这里面临的挑战是为此编写一个查询。

那么我还在想,寻找一个简单的选项。让我介绍一个问题。

Name ----- Age ----- MarksForMaths ---- AvgByTotal 

以上是一个简单的示例模式,它可以是少数学生为数学和所有平均分数所采取的标记。

我需要根据以下标准过滤掉这个集合。

  1. 人谁得到75> Mathsmarks> 50应该在上面
  2. 人谁得到Mathsmarks> 90应该是下一组
  3. 人谁平均> 65今后应采取的地方
  4. 老年人年龄> 55应该是最后一组

是的,显然排名和过滤器是一个选项,但我们可以在优化查询吗?

提示 - 我基本上做的是创建一个额外的列名RANK并根据条件使用索引更新列。

然后它只是一个问题或过滤数据顺序RANK。小菜一碟 !

但这里的问题是,我们可以去一个镜头查询吗?欣赏提示。

感谢

+0

哪里你的数据从何而来? – 2015-03-31 09:07:15

回答

0

请问下面的查询与您的要求符合:

DECLARE @BaseTable TABLE (Name VARCHAR(50), Age INT, MarksForMaths INT, AvgByTotal INT) 

INSERT INTO @BaseTable (Name, Age, MarksForMaths, AvgByTotal) 
SELECT 'A', 1, 65, 12 UNION ALL 
SELECT 'B', 1, 5, 75 UNION ALL 
SELECT 'C', 1, 95, 12 UNION ALL 
SELECT 'D', 65, 65, 12 UNION ALL 
SELECT 'E', 65, 5, 12 

SELECT tmp.Name, tmp.TmpRank 
FROM 
(
    SELECT 
     Name, 
     CASE 
      WHEN (MarksForMaths > 50 AND MarksForMaths < 75) THEN 1 
      WHEN (MarksForMaths > 90) THEN 2 
      WHEN (AvgByTotal > 65) THEN 3 
      WHEN (Age > 55) THEN 4 
      ELSE 5 
     END AS TmpRank 
    FROM @BaseTable 
) tmp 
ORDER BY tmp.TmpRank