创建一个包含多列

时间:2016-05-12 22:40:09

标签: sql-server view group-by

我需要创建一个显示各种总数的视图。

我有两张桌子。一个具有UserID和作业应用程序的状态代码。另一个包含UserID和包含布尔0/1的4列。这些列中的每一列都表示工作技能(如跑步,跳跃,投掷,攀爬)。视图只需要显示每个工作技能的总计,一次是针对正在进行的应用程序,一次是针对已完成的那些。我无法搞清楚小组并为每项技能选择列。

User表有ID(int)和ApplicationStatus(varchar4) applicationStatus是:

  • 0000如果尚未启动
  • 0500正在进行中
  • 1000完成后。

JobSkills表有: ID,usertable的匹配UserID和4个JobSkill列:JobSkill_1,JobSkill_2,JobSkill_3和JobSkill_4,每个都定义为整数,如果用户具有该技能,则包含1。 该视图应显示以下摘要:

  • 有多少用户的状态为0000
  • 有多少人拥有0500的状态
  • 有多少人的状态为1000
  • 有多少人的状态为1000,而JobSkill_1 = 1
  • 有多少人的状态为1000,而JobSkill_2 = 1
  • 有多少人的状态为1000,而JobSkill_3 = 1
  • 以及有多少人的状态为1000,而JobSkill_4 = 1

类似的东西:

SELECT 
    [UserID],
    SUM(JobSKill_1) as Run,
    SUM(JobSkill_2) AS Jump,
    SUM(JobSkill_3) AS Throw, 
    SUM(JobSkill_4) AS Climb
FROM [dbo].[tblJobSkills]
GROUP BY [UserID] WITH ROLLUP

1 个答案:

答案 0 :(得分:1)

您似乎需要条件聚合才能获得所需的结果。

在SQL Server中,聚合函数可以将表达式作为参数(例如SUM)。

因此可以在聚合函数中使用CASE WHEN表达式 SELECT SUM( CASE ApplicationStatus WHEN '0000' THEN 1 ELSE 0 END ) AS NotStartedCnt, SUM( CASE ApplicationStatus WHEN '0500' THEN 1 ELSE 0 END ) AS InProgressCnt, SUM( CASE ApplicationStatus WHEN '1000' THEN 1 ELSE 0 END ) AS CompletedCnt, SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_1 ELSE 0 END ) AS JobSkill_1Count, SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_2 ELSE 0 END ) AS JobSkill_2Count, SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_3 ELSE 0 END ) AS JobSkill_3Count, SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_4 ELSE 0 END ) AS JobSkill_4Count FROM User AS U INNER JOIN JobSkills AS JS ON U.ID = JS.UserID
 其中a,b,c,d可以是列,常数,函数或表达式(见CASE

以上将导致对每一行评估CASE表达式,并将结果作为输入传递给SUM函数。

注意:以上与CA​​SE WHEN SUM()= a THEN b ELSE c END不同,因为在这种情况下,SUM函数首先处理所有输入行,并且仅比较SUM函数的结果。

使用上述方法,可以在不同于GROUP BY中指定的条件集合上进行聚合。

您的问题的解决方案(假设User和JobSkills之间的一对一关系)如下:

<div id="container" >
{% unless settings.portfolio_collection == blank or collections[settings.portfolio_collection].empty? %}
{% assign collection = collections[settings.portfolio_collection] %}

<ul class="grid clearfix">
  {% for product in collection.products %}
    <li class="masonryImage three-per-row centered">
      <img style="border:1px solid white;" src="{{ product | img_url: 'grande' }}"/>
    </li>
  {% endfor %}
  {% include 'portfolio-layout.js' %}
</ul>
{%endunless%}
</div>