基于月和年的订购交叉标签查询

时间:2013-07-06 08:17:34

标签: sql sql-server sql-server-2008

这是我的表架构

+---------------+----------+-------------------+-----------------------------+----------------------------------+-----------+-------------+------------+-------------+--------+----------+----------+
|   VERTICAL    |   LOB    |      PROCESS      |         SUB PROCESS         |             ACTIVITY             |   MNTH    | OPPORTUNITY | DEFECTS(F) | DEFECTS(NF) |  CTQ   |   TYPE   | CATEGORY |
+---------------+----------+-------------------+-----------------------------+----------------------------------+-----------+-------------+------------+-------------+--------+----------+----------+
| Bill Delivery | Mobility | Service Complaint | Original eBill not Received | Original eBill not received      | 31-May-13 |         895 |          0 |          20 | Repeat | Customer | D        |
| Bill Delivery | Mobility | Service Complaint | MNP- Bill Delivery          | Bill Delivery Issue              | 30-Apr-13 |          12 |          0 |           0 | CAR    | Customer | C        |
| Bill Delivery | Mobility | Service Complaint | MNP- Bill Delivery          | Bill Delivery Issue              | 30-Apr-13 |         179 |          0 |           0 | CAR    | Customer | C        |
| Bill Delivery | Mobility | Service Complaint | Original Bill not Received  | Original Paper Bill not received | 30-Apr-13 |        1157 |          0 |           0 | CAR    | Customer | D        |
| Bill Delivery | Mobility | Service Complaint | Original Bill not Received  | Original Paper Bill not received | 30-Apr-13 |       16381 |          0 |          38 | CAR    | Customer | D        |
| Bill Delivery | Mobility | Service Complaint | Original eBill not Received | Original eBill not received      | 30-Apr-13 |          75 |          0 |           1 | CAR    | Customer | D        |
| Bill Delivery | Mobility | Service Complaint | Original eBill not Received | Original eBill not received      | 30-Apr-13 |         913 |          0 |          10 | CAR    | Customer | D        |
| Bill Delivery | Mobility | Service Request   | Duplicate Bill to be sent   | Duplicate Paper Bill to be sent  | 30-Apr-13 |        1022 |          0 |           1 | CAR    | Customer | D        |
| Bill Delivery | Mobility | Service Request   | Duplicate Bill to be sent   | Duplicate Paper Bill to be sent  | 30-Apr-13 |       14278 |          0 |          25 | CAR    | Customer | D        |
| Bill Delivery | Mobility | Service Request   | Other Delivery related      | Statement of Account to be sent  | 30-Apr-13 |          16 |          0 |           0 | CAR    | Customer | D        |
| Bill Delivery | Mobility | Service Request   | Other Delivery related      | Statement of Account to be sent  | 30-Apr-13 |         627 |          0 |          17 | CAR    | Customer | D        |
| Billing       | Mobility | Service Complaint | Billing Discrepancy         | 2G -  Usage & Rental Issue       | 30-Apr-13 |         849 |          0 |          40 | CAR    | Customer | C        |
| Billing       | Mobility | Service Complaint | Billing Discrepancy         | 2G -  Usage & Rental Issue       | 30-Apr-13 |        7834 |          0 |         569 | CAR    | Customer | C        |
| Billing       | Mobility | Service Complaint | Billing Discrepancy         | 3G -  Usage & Rental Issue       | 30-Apr-13 |         529 |          0 |          31 | CAR    | Customer | C        |
| Billing       | Mobility | Service Complaint | Billing Discrepancy         | 3G -  Usage & Rental Issue       | 30-Apr-13 |        3456 |          0 |         233 | CAR    | Customer | C        |
| Billing       | Mobility | Service Complaint | Billing Discrepancy         | 4G -  Usage & Rental Issue       | 30-Apr-13 |          17 |          0 |           0 | CAR    | Customer | C        |
+---------------+----------+-------------------+-----------------------------+----------------------------------+-----------+-------------+------------+-------------+--------+----------+----------+

我使用了以下Cross Tab查询来获得所需格式的输出

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

    SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(DATENAME(MONTH, MNTH)+''+DATENAME(YEAR, MNTH)) 
                    FROM CAPABILITY
                  WHERE DATENAME(YEAR,MNTH)>2012
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
SET @query = 'SELECT VERTICAL, PROCESS, [SUB PROCESS], ACTIVITY, CTQ, TYPE,' 

+@cols+ 
'FROM  

(
SELECT VERTICAL, PROCESS,TYPE,CTQ,[SUB PROCESS], ACTIVITY,
    CASE
WHEN
(SUM([DEFECTS(F)])+SUM([DEFECTS(NF)]))=0
THEN
6
WHEN
(SUM([DEFECTS(F)])+SUM([DEFECTS(NF)]))= SUM(OPPORTUNITY)
THEN
0
WHEN
(SUM([DEFECTS(F)])+SUM([DEFECTS(NF)]))> SUM(OPPORTUNITY)
THEN 
''ERROR'' 
ELSE
DBO.NORMSINV((1-(SUM([DEFECTS(F)])+SUM([DEFECTS(NF)]))/SUM(OPPORTUNITY)))+1.5
END AS Sigma    

    ,DATENAME(MONTH, MNTH)+''''+DATENAME(YEAR, MNTH)
 AS MONTHS
    FROM CAPABILITY

        GROUP BY VERTICAL, PROCESS, DATENAME(MONTH, MNTH)+''''+DATENAME(YEAR, MNTH),TYPE,CTQ,[SUB PROCESS],ACTIVITY





)X

PIVOT 
            (
                MIN(SIGMA)
                FOR MONTHS in (' + @cols + ')
            ) X '

            --//PRINT (@QUERY)
EXECUTE (@QUERY)

这给出了以下输出

+--------------+--------------+-------------------------------------+-------------------------------------+-----+---------------+--------+--------+--------+--------+--------+
|   VERTICAL   |   PROCESS    |             SUB PROCESS             |              ACTIVITY               | CTQ |     TYPE      | Feb-13 | Apr-13 | May-13 | Mar-13 | Jan-13 |
+--------------+--------------+-------------------------------------+-------------------------------------+-----+---------------+--------+--------+--------+--------+--------+
| Airtel Money | Airtel Money | 10% cashback                        | 10% cashback                        | SQ  | Transactional | NULL   | 6      | NULL   | NULL   | NULL   |
| Airtel Money | Airtel Money | 5 % Cashback                        | 5 % Cashback                        | SQ  | Transactional | NULL   | 6      | NULL   | NULL   | NULL   |
| Airtel Money | Airtel Money | 5 % Cashback Post paid Self payment | 5 % Cashback Post paid Self payment | SQ  | Transactional | NULL   | NULL   | 6      | NULL   | NULL   |
| Airtel Money | Airtel money | APEF                                | APEF                                | SQ  | Transactional | NULL   | NULL   | NULL   | NULL   | NULL   |
| Airtel Money | Airtel money | Bank File                           | BANK FILE                           | SQ  | Transactional | NULL   | NULL   | NULL   | NULL   | NULL   |
+--------------+--------------+-------------------------------------+-------------------------------------+-----+---------------+--------+--------+--------+--------+--------+

我面临的唯一限制是我无法根据月份和年份按降序(或升序)顺序排列详细信息。因此,而不是" FEB -13"," APRIL-13"," MAY -13"," MARCH-13",&#34 ; JAN -13"我希望它按正确的顺序(1月13日至5月13日)。有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

试试这个

   SELECT @cols = ISNULL(@cols+',','') + QUOTENAME(DATENAME(MONTH, MNTH)+''+DATENAME(YEAR, MNTH)) 
    FROM CAPABILITY
    WHERE MNTH>='20120101'
    GROUP BY DATENAME(MONTH, MNTH), DATENAME(YEAR, MNTH), DATEPART(MONTH,mnth)
    ORDER BY DATENAME(YEAR, MNTH), DATEPART(MONTH,mnth)

我也替换了

WHERE DATENAME(YEAR,MNTH)>2012

WHERE MNTH>='20120101'

因为第一个保证索引扫描不是你想要的。