2013-03-11 70 views
6

我试图通过与SQL查询做了一个先进的订单高级SQL Server的订购

我有一个用来跟踪工作流程及其相关活动

以前的活动(已完成的)数据库处于closed状态。他们同时拥有Active_DateClosed_Date集合

当前活动处于active状态。有一个Active_Date集,但Closed_DateNULL

对于每个ECR.item_number只会出现在active状态的一个活动

我想通过

  1. ECR.item_number订购,但我想为了根据active状态中哪个活动降序排列
  2. A.ACTIVE_DATE

查询:

SELECT 
    ECR.item_number, 
    ECR.title, 
    convert(VARCHAR(10),ECR.CREATED_ON,120) AS [Date CR Created], 
    convert(VARCHAR(10),A.ACTIVE_DATE,120) AS [Activity Activated], 
    convert(VARCHAR(10),A.CLOSED_DATE,120) AS [Activity Closed], 
    A.STATE, 
    A.NAME AS [Activity Name], 

    (CASE 
     WHEN 
      (A.STATE='Closed') 
     THEN 
      DATEDIFF(DAY, A.ACTIVE_DATE, A.CLOSED_DATE)  
    END) AS [DAYS ACTIVITY (WAS) OPEN], 

    (CASE 
     WHEN 
      (A.STATE='Active') 
     THEN 
      DATEDIFF(DAY, A.ACTIVE_DATE, Getdate()) 
    END) AS [DAYS ACTIVITY HAS BEEN OPEN] 

FROM 
    innovator.ecr AS ECR 
    INNER JOIN innovator.workflow AS WF 
     ON CR.id = WF.source_id 
    INNER JOIN innovator.workflow_process AS WFP 
     ON WF.related_id = WFP.id 
    INNER JOIN innovator.workflow_process_activity AS WPA 
     ON WFP.id = WPA.source_id 
    INNER JOIN innovator.activity AS A 
     ON WPA.related_id = A.id 

--Shown for clarity 
ORDER BY 
    ECR.ITEM_NUMBER, 
    [Activity Activated] 

采样返回数据

|-----------+-----------+-------------------+-----------------------+-----------------------+-------------------+-------------------------------+-------------------------------| 
|CR Number | Title | Date CR Created | Activity Name  | Activity Activated | Activity Closed | DAYS ACTIVITY (WAS) OPEN | DAYS ACTIVITY HAS BEEN OPEN | 
|-----------+-----------+-------------------+-----------------------+-----------------------+-------------------+-------------------------------+-------------------------------| 
|CR-000119 | ITEM 1 | 4/12/2012  | Submit CR   | 4/12/2012   | 31/01/2013  | 58       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | Check CR   | 31/01/2013   | 13/02/2013  | 13       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | Review CR   | 13/02/2013   | 21/02/2013  | 8       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | Technical Review | 21/02/2013   | 28/02/2013  | 7       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | CRB Meeting   | 28/02/2013   | NULL   | NULL      | 11       | 
|CR-00| ITEM 2 | 6/12/2012  | Check CR   | 6/12/2012   | 21/12/2012  | 15       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | Submit CR   | 6/12/2012   | 6/12/2012  | 0       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | Review CR   | 21/12/2012   | 17/01/2013  | 27       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | Technical Review | 17/01/2013   | 6/03/2013  | 48       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | CRB Meeting   | 6/03/2013   | NULL   | NULL      | 5       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Submit CR   | 11/01/2013   | 15/01/2013  | 4       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Check CR   | 15/01/2013   | 16/01/2013  | 1       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Review CR   | 16/01/2013   | 21/01/2013  | 5       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Technical Review | 21/01/2013   | 25/01/2013  | 4       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | CRB Meeting   | 25/01/2013   | 31/01/2013  | 6       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Technical Review | 31/01/2013   | 27/02/2013  | 27       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | CRB Meeting   | 27/02/2013   | NULL   | NULL      | 12       | 
|-----------+-----------+-------------------+-----------------------+-----------------------+-------------------+-------------------------------+-------------------------------| 

所需的结果

|-----------+-----------+-------------------+-----------------------+-----------------------+-------------------+-------------------------------+-------------------------------| 
|CR Number | Title | Date CR Created | Activity Name  | Activity Activated | Activity Closed | DAYS ACTIVITY (WAS) OPEN | DAYS ACTIVITY HAS BEEN OPEN | 
|-----------+-----------+-------------------+-----------------------+-----------------------+-------------------+-------------------------------+-------------------------------| 
|CR-000136 | ITEM 3 | 11/01/2013  | Submit CR   | 11/01/2013   | 15/01/2013  | 4       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Check CR   | 15/01/2013   | 16/01/2013  | 1       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Review CR   | 16/01/2013   | 21/01/2013  | 5       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Technical Review | 21/01/2013   | 25/01/2013  | 4       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | CRB Meeting   | 25/01/2013   | 31/01/2013  | 6       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | Technical Review | 31/01/2013   | 27/02/2013  | 27       | 0       | 
|CR-000136 | ITEM 3 | 11/01/2013  | CRB Meeting   | 27/02/2013   | NULL   | NULL      | 12       | 
|CR-000119 | ITEM 1 | 4/12/2012  | Submit CR   | 4/12/2012   | 31/01/2013  | 58       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | Check CR   | 31/01/2013   | 13/02/2013  | 13       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | Review CR   | 13/02/2013   | 21/02/2013  | 8       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | Technical Review | 21/02/2013   | 28/02/2013  | 7       | 0       | 
|CR-000119 | ITEM 1 | 4/12/2012  | CRB Meeting   | 28/02/2013   | NULL   | NULL      | 11       | 
|CR-00| ITEM 2 | 6/12/2012  | Check CR   | 6/12/2012   | 21/12/2012  | 15       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | Submit CR   | 6/12/2012   | 6/12/2012  | 0       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | Review CR   | 21/12/2012   | 17/01/2013  | 27       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | Technical Review | 17/01/2013   | 6/03/2013  | 48       | 0       | 
|CR-00| ITEM 2 | 6/12/2012  | CRB Meeting   | 6/03/2013   | NULL   | NULL      | 5       | 
|-----------+-----------+-------------------+-----------------------+-----------------------+-------------------+-------------------------------+-------------------------------| 

回答

2

在这种情况下,我觉得ECR.item_number处于活跃状态,并指定这个日期到整个组ECR.item_number通过MAX()OVER()子句。在SELECT语句中,对新列进行进一步排序(升序),其位置为10。您也可以在SELECT语句

SELECT ECR.item_number, 
     ECR.title, 
     convert(VARCHAR(10),ECR.CREATED_ON,120) AS [Date CR Created], 
     convert(VARCHAR(10),A.ACTIVE_DATE,120) AS [Activity Activated], 
     convert(VARCHAR(10),A.CLOSED_DATE,120) AS [Activity Closed], 
     A.STATE, 
     A.NAME AS [Activity Name], 
    (CASE WHEN (A.STATE='Closed') 
      THEN DATEDIFF(DAY, A.ACTIVE_DATE, A.CLOSED_DATE)  
    END) AS [DAYS ACTIVITY (WAS) OPEN], 
    (CASE WHEN (A.STATE='Active') 
     THEN DATEDIFF(DAY, A.ACTIVE_DATE, Getdate()) 
    END) AS [DAYS ACTIVITY HAS BEEN OPEN], 
    MAX(CASE WHEN A.CLOSED_DATE IS NULL THEN A.ACTIVE_DATE END) OVER (PARTITION BY ECR.item_number) 
FROM innovator.ecr AS ECR 
    INNER JOIN innovator.workflow AS WF 
     ON CR.id = WF.source_id 
    INNER JOIN innovator.workflow_process AS WFP 
     ON WF.related_id = WFP.id 
    INNER JOIN innovator.workflow_process_activity AS WPA 
     ON WFP.id = WPA.source_id 
    INNER JOIN innovator.activity AS A 
     ON WPA.related_id = A.id 
ORDER BY 10 ASC, ECR.ITEM_NUMBER, A.ACTIVE_DATE ASC 

简单的演示使用上SQLFiddle

+0

非常感谢你,这个伟大的工程 – Spacko 2013-03-11 10:22:58

+0

你”对于一个好问题,欢迎..thx;) – 2013-03-11 10:32:21

2

别名作为排序列,而不是10位上数这里的关键是让每个项目的Active活动的日期。这可以通过使用分析函数来完成:

[DateOfActiveActivity] = MIN(CASE WHEN A.CLOSED_DATE IS NULL THEN A.ACTIVE_DATE END) OVER(PARTITION BY ECR.item_number) 

所以这个集成到您查询,您可以使用:

WITH CTE AS 
( SELECT [CRNumber] = ECR.item_number, 
      ECR.title, 
      [DateCRCreated] = CAST(ECR.CREATED_ON AS DATE), 
      [ActivityActivated] = CAST(A.ACTIVE_DATE AS DATE), 
      [ActivityClosed] = CAST(A.CLOSED_DATE AS DATE), 
      A.STATE, 
      [ActivityName] = A.NAME, 
      [DAYSACTIVITYOPEN] = CASE WHEN A.STATE = 'Closed' THEN DATEDIFF(DAY, A.ACTIVE_DATE, A.CLOSED_DATE) END, 
      [DAYSACTIVITYHASBEENOPEN] = CASE WHEN A.STATE = 'Active' THEN DATEDIFF(DAY, A.ACTIVE_DATE, GETDATE()) END, 
      [DateOfActiveActivity] = MIN(CASE WHEN A.CLOSED_DATE IS NULL THEN A.ACTIVE_DATE END) OVER(PARTITION BY ECR.item_number) 
    FROM innovator.ecr AS ECR 
      INNER JOIN innovator.workflow AS WF 
       ON CR.id = WF.source_id 
      INNER JOIN innovator.workflow_process AS WFP 
       ON WF.related_id = WFP.id 
      INNER JOIN innovator.workflow_process_activity AS WPA 
       ON WFP.id = WPA.source_id 
      INNER JOIN innovator.activity AS A 
       ON WPA.related_id = A.id 
) 
SELECT [CR Number] = [CRNumber], 
     Title, 
     [Date CR Created] = CONVERT(VARCHAR(10), DateCRCreated, 120), 
     [Activity Activated] = CONVERT(VARCHAR(10), ActivityActivated, 120), 
     [Activity Closed] = CONVERT(VARCHAR(10), ActivityClosed, 120), 
     [STATE], 
     [Activity Name] = ActivityName, 
     [DAYS ACTIVITY (WAS) OPEN] = [DAYSACTIVITYOPEN], 
     [DAYS ACTIVITY HAS BEEN OPEN] = [DAYSACTIVITYHASBEENOPEN] 
FROM CTE 
ORDER BY DateOfActiveActivity ASC, ActivityActivated, ActivityClosed; 

Demo with sample data on SQL Fiddle

+0

非常感谢,这个作品也很棒。 – Spacko 2013-03-11 10:22:24