2013-11-20 7 views
0

저는이 포럼에 참여한 모든 사람들에게 엄청난 감사를 드리고 싶습니다. 지식과 예제의 과다한은 [프로젝트 이름을 여기에 삽입하기] 전날 오전 3시에 놀라운 자료 였고 벽에 올랐습니다 ... LOL.월별 및 분기 별 쿼리 주문

저는 달과 분기별로 분류 된 데이터의 정규 보고서로 실행되는 간단한 쿼리를 만들었고 올바른 값을 가져옵니다. 그러나 주문에 문제가 있습니다.

SELECT 
CASE DATEPART(mm, dtDate) 
WHEN 01 THEN 'JAN' WHEN 02 THEN 'FEB' WHEN 03 THEN 'MAR' 
WHEN 04 THEN 'APR' WHEN 05 THEN 'MAY' WHEN 06 THEN 'JUN' 
WHEN 07 THEN 'JUL' WHEN 08 THEN 'AUG' WHEN 09 THEN 'SEP' 
WHEN 10 THEN 'OCT' WHEN 11 THEN 'NOV' WHEN 12 THEN 'DEC' 
END 
AS 'Month', 

SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount 
    ELSE 0 END) AS 'DM',  
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount 
    ELSE 0 END) AS 'TM',   
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount 
    ELSE 0 END) AS 'FI',  
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount 
    ELSE 0 END) AS 'GR',  
SUM(CASE WHEN sAccount = 'NM' THEN mAmount 
    ELSE 0 END) AS 'NM',  
SUM(mAmount) AS 'Total' 

FROM Contrib 
WHERE iDeleted = '0' 

GROUP BY DATEPART(mm, dtDate) 

UNION 

SELECT 
CASE DATEPART(qq, dtDate) 
WHEN 01 THEN 'Q1' 
WHEN 02 THEN 'Q2' 
WHEN 03 THEN 'Q3' 
WHEN 04 THEN 'Q4' 
END 
AS 'Month', 

SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount 
    ELSE 0 END) AS 'DM',  
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount 
    ELSE 0 END) AS 'M', 
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount 
    ELSE 0 END) AS 'FI', 
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount 
    ELSE 0 END) AS 'GR', 
SUM(CASE WHEN sAccount = 'NM' THEN mAmount 
    ELSE 0 END) AS 'NM',  
SUM(mAmount) AS 'Total' 

FROM Contrib 
WHERE iDeleted = '0' 

GROUP BY DATEPART(qq, dtDate) 
: 여기

Month DM   TM   FI   GR   NM   Total 
APR  0.00  0.00  1230059.00 6395.00  1275636.61 2575700.61 
AUG  62750.35 9159.00  151561.28 15020.88 1248286.28 1532631.93 
FEB  0.00  0.00  535000.00 0.00  587337.00 1222337.00 
JAN  0.00  0.00  50000.00 0.00  0.00  50000.00 
JUL  258362.92 49541.00 359178.50 19674.33 803417.96 1933347.71 
JUN  213716.34 141050.00 746302.28 25007.68 2551383.23 3962339.23 
MAR  0.00  0.00  614146.00 5611.00  2920193.41 3541744.41 
MAY  0.00  45796.00 101160.00 15473.18 1356653.55 1931181.73 
NOV  26213.00 61683.00 130270.90 13099.75 496460.05 729362.84 
OCT  198565.10 189847.00 626951.11 29517.00 978797.85 2043531.20 
Q1  0.00  0.00  1199146.00 5611.00  3507530.41 4814081.41 
Q2  213716.34 186846.00 2077521.28 46875.86 5183673.39 8469221.57 
Q3  583359.64 194764.00 709105.77 72092.94 5322894.95 7483637.58 
Q4  224778.10 251530.00 757222.01 42616.75 1475257.90 2772894.04 
SEP  262246.37 136064.00 198365.99 37397.73 3271190.71 4017657.94 

나에게 알파벳 순으로 결과를 얻는 쿼리입니다 :

Month DM   TM   FI   GR   NM   Total 
JAN  0   0   50000  0   0   50000 
FEB  0   0   535000  0   620043.77 1255043.77 
MAR  0   0   614146  5611  3016237.91 3637788.91 
Q1  0   0   1199146  5611  3636281.68 4942832.68 
APR  0   0   1230059  6395  1278525.79 2578589.79 
MAY  0   45796  101160  15473.18 1357877.7 1932405.88 
JUN  213716.34 141050  746302.28 25007.68 2552277.35 3963233.35 
Q2  213716.34 186846  2077521.28 46875.86 5188680.84 8474229.02 
JUL  258362.92 49541  359178.5 19674.33 803987.99 1928917.74 
AUG  62750.35 9159  151561.28 15020.88 1248746.28 1533091.93 
SEP  262246.37 136064  198365.99 37397.73 3271355.71 4017822.94 
Q3  583359.64 194764  709105.77 72092.94 5324089.98 7479832.61 
OCT  198565.1 189847  626951.11 29517  978947.85 2048681.2 
NOV  22391  53652  155140.84 11444.75 470482.95 714747.68 
Q4  220956.1 243499  782091.95 40961.75 1449430.8 2763428.88 

그러나, 이것이 내가 집착 곳이다 : 이것은 내가 반환하는 쿼리 결과를 원하는 것입니다

질의에 order by 절을 추가하는 여러 가지 방법을 시도했지만 성공하지 못했습니다. 일반적으로 Msg 104, Level 16 ... "ORDER BY 항목은 선택 목록에 나타나야합니다. 유엔을 포함하다 ION, INTERSECT 또는 EXCEPT 연산자 "). 나는 나의 문제가 노동 조합과 2 개의 다른 datepart 함수 (월 대 분기) 때문인 것으로 의심된다.

아직 초록색이기 때문에이 쿼리를 구성하는 데보다 효율적인 방법이 있는지 또는 내 걸림돌이 어디에 있는지 알 수 있다고 생각되면 알려 주시기 바랍니다. .

감사합니다.

+0

당신이 당신의 쿼리에서 "1 BY ORDER"간단한 단지를 시도하여 쿼리를 적응 ROLLUP

SELECT [Month] = CASE WHEN GROUPING(DATEPART(MM, OrderDate)) = 1 THEN 'Q' + CAST(DATEPART(QQ, OrderDate) AS VARCHAR(2)) ELSE CAST(DATEPART(MM, OrderDate) AS VARCHAR(4)) END, SUM(TotalDue) [TotalDue] FROM AdventureWorks.Sales.SalesOrderHeader GROUP BY DATEPART(YY, OrderDate), DATEPART(QQ, OrderDate), DATEPART(MM, OrderDate) WITH ROLLUP HAVING GROUPING(DATEPART(QQ, OrderDate))=0 ORDER BY MAX(OrderDate) 

사용하여이 솔루션을 함께했다? – abhi

+0

@abhi 잘, 하나, [결코 사용 ORDER BY ] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/06/bad-habits-to-kick-order-by-ordinal. aspx). 둘째, 어떻게 도움이 될까요? 첫 번째 열은 월 이름입니다. 나는 목표가 APR, AUG, FEB에 의한 주문이라고 생각하지 않는다. –

답변

1

난 당신이 어쩌면이 같은 ... 뭔가를 선택에 다른 열을 추가하고 주문을 위해 그것을 사용하는 것이 필요할 것 같은데요?

SELECT 
CASE DATEPART(mm, dtDate) 
WHEN 01 THEN '01' WHEN 02 THEN '02' WHEN 03 THEN '04' 
WHEN 04 THEN '05' WHEN 05 THEN '06' WHEN 06 THEN '07' 
WHEN 07 THEN '09' WHEN 08 THEN '10' WHEN 09 THEN '11' 
WHEN 10 THEN '13' WHEN 11 THEN '14' WHEN 12 THEN '15' 
END 
AS 'Order', 
CASE DATEPART(mm, dtDate) 
WHEN 01 THEN 'JAN' WHEN 02 THEN 'FEB' WHEN 03 THEN 'MAR' 
WHEN 04 THEN 'APR' WHEN 05 THEN 'MAY' WHEN 06 THEN 'JUN' 
WHEN 07 THEN 'JUL' WHEN 08 THEN 'AUG' WHEN 09 THEN 'SEP' 
WHEN 10 THEN 'OCT' WHEN 11 THEN 'NOV' WHEN 12 THEN 'DEC' 
END 
AS 'Month', 

SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount 
    ELSE 0 END) AS 'DM',  
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount 
    ELSE 0 END) AS 'TM',   
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount 
    ELSE 0 END) AS 'FI',  
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount 
    ELSE 0 END) AS 'GR',  
SUM(CASE WHEN sAccount = 'NM' THEN mAmount 
    ELSE 0 END) AS 'NM',  
SUM(mAmount) AS 'Total' 

FROM Contrib 
WHERE iDeleted = '0' 

GROUP BY DATEPART(mm, dtDate) 

UNION 

SELECT 
CASE DATEPART(qq, dtDate) 
WHEN 01 THEN '05' 
WHEN 02 THEN '08' 
WHEN 03 THEN '12' 
WHEN 04 THEN '16' 
END 
AS 'Order', 

CASE DATEPART(qq, dtDate) 
WHEN 01 THEN 'Q1' 
WHEN 02 THEN 'Q2' 
WHEN 03 THEN 'Q3' 
WHEN 04 THEN 'Q4' 
END 
AS 'Month', 

SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount 
    ELSE 0 END) AS 'DM',  
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount 
    ELSE 0 END) AS 'M', 
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount 
    ELSE 0 END) AS 'FI', 
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount 
    ELSE 0 END) AS 'GR', 
SUM(CASE WHEN sAccount = 'NM' THEN mAmount 
    ELSE 0 END) AS 'NM',  
SUM(mAmount) AS 'Total' 

FROM Contrib 
WHERE iDeleted = '0' 

GROUP BY DATEPART(qq, dtDate) 

ORDER BY 'Order' 
0

AdventureWorks 2012를 사용하여 나는

SELECT 
    CASE WHEN GROUPING(DATEPART(MM, dtDate)) = 1 THEN 'Q' + CAST(DATEPART(QQ, dtDate) AS VARCHAR(2)) 
     ELSE STUFF(CAST(DATEPART(MM, dtDate) AS VARCHAR(4)), 1, 0, REPLICATE('0', 2 - LEN(CAST(DATEPART(MM, dtDate) AS VARCHAR(4))))) END, 
    SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount 
      ELSE 0 END) AS 'DM',  
    SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount 
    ELSE 0 END) AS 'TM',   
    SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount 
      ELSE 0 END) AS 'FI',  
    SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount 
      ELSE 0 END) AS 'GR',  
    SUM(CASE WHEN sAccount = 'NM' THEN mAmount 
      ELSE 0 END) AS 'NM',  
    SUM(mAmount) AS 'Total' 
FROM Contrib 
WHERE iDeleted = '0' 
GROUP BY DATEPART(YY, dtDate), DATEPART(QQ, dtDate), DATEPART(MM, dtDate) WITH ROLLUP 
HAVING GROUPING(DATEPART(QQ, dtDate))=0 
ORDER BY MAX(dtDate)