SQL 問題

本帖最後由 luckiejacky 於 2015-4-10 20:05 編輯

如果Attention個Category是零
點可以出 0

  1. select tl.tl, COUNT(*) AS cnt
  2.                    from
  3.                    (select i.ItemNo,
  4.                                          case when i.RevTargetFinishDate IS NULL
  5.                                            then 'Pls enter target finish date'
  6.                                          when i.ActualFinishDate IS NOT NULL
  7.                                                 then 'Closed'
  8.                                          when i.ActualFinishDate IS NULL AND i.RevTargetFinishDate < GETDATE()
  9.                                                 then 'Overdue'
  10.                                          when i.ActualFinishDate IS NULL AND i.RevTargetFinishDate >= GETDATE() AND DATEDIFF(day, GETDATE(), i.RevTargetFinishDate) > 3
  11.                                                    then 'In progress'
  12.                                          when i.ActualFinishDate IS NULL AND i.RevTargetFinishDate >= GETDATE() AND DATEDIFF(day, GETDATE(), i.RevTargetFinishDate) <= 3
  13.                                                 then 'Attention'
  14.                                          else  
  15.                                                  'Internal Error'                              
  16.                                          end AS tl
  17.                                 from IssueLog AS i) AS tl
  18.                                 LEFT JOIN
  19.                                              IssueLog AS i                                                    
  20.                                 ON i.ItemNo = tl.ItemNo                                         
  21.                                     group by tl.tl;
複製代碼

如果Attention個Category是零
點可以出 0
luckiejacky 發表於 2015-4-10 20:04


union all 加多幾項, 之後 再減番 1

TOP

本帖最後由 luckiejacky 於 2015-4-13 14:33 編輯

[del]..........

TOP

"COUNT(*) AS cnt" -> "COUNT(tl.ItemNo) AS cnt"

"from IssueLog AS i" -> "from IssueLog AS i union all select to_number(null) ItemNo, 'Attention' tl from dual"

[如果 ItemNo 係 char/varchar2/etc.,  "to_number(null)" 改 "to_char(null)" ]

TOP

本帖最後由 luckiejacky 於 2015-4-13 17:36 編輯

Thanks
仲有一條問題
如果Query中的 _4Months, _3Months 等想改做 03/2015, 02/2015, 01/2015, 12/2014
有咩方法?
THX


  1. USE RCS;

  2. select finalall.RespName,finalall._4Months , finalall._3Months, finalall._2Months, finalall._1Month,
  3.    finalall._4Months + finalall._3Months + finalall._2Months + finalall._1Month AS total   
  4.     from
  5.     (select final.RespName, final._4Months, final._3Months, final._2Months, final._1Month, final.union_order
  6.       from
  7.       (select r.RespName, count(four.ItemNo) AS _4Months,
  8.         COUNT(three.ItemNo) AS _3Months, count(two.ItemNo) AS _2Months,
  9.         count(one.ItemNo) AS _1Month, 0 AS union_order
  10.                   from
  11.                   IssueLog AS i
  12.                                 INNER JOIN
  13.                           RespCat AS r                     
  14.                           ON i.RespCatID = r.RespCatID                   
  15.                           LEFT JOIN
  16.                           (select i.ItemNo
  17.                              from IssueLog AS i
  18.                                INNER JOIN  
  19.                              RespCat AS r
  20.                                ON i.RespCatID = r.RespCatID
  21.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 4
  22.                              group by i.ItemNo, r.RespName
  23.                              ) AS four
  24.                           ON i.ItemNo = four.ItemNo
  25.                           LEFT JOIN
  26.                            (select i.ItemNo
  27.                              from IssueLog AS i
  28.                                INNER JOIN  
  29.                              RespCat AS r
  30.                                ON i.RespCatID = r.RespCatID
  31.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 3
  32.                              group by i.ItemNo, r.RespName
  33.                              ) AS three
  34.                           ON i.ItemNo = three.ItemNo
  35.                           LEFT JOIN
  36.                            (select i.ItemNo
  37.                              from IssueLog AS i
  38.                                INNER JOIN  
  39.                              RespCat AS r
  40.                                ON i.RespCatID = r.RespCatID
  41.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 2
  42.                              group by i.ItemNo, r.RespName
  43.                              ) AS two
  44.                           ON i.ItemNo = two.ItemNo
  45.                           LEFT JOIN
  46.                            (select i.ItemNo
  47.                              from IssueLog AS i
  48.                                INNER JOIN  
  49.                              RespCat AS r
  50.                                ON i.RespCatID = r.RespCatID
  51.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 1
  52.                              group by i.ItemNo, r.RespName
  53.                              ) AS one
  54.                           ON i.ItemNo = one.ItemNo
  55.                           WHERE i.RespCatID != 1
  56.                   group by r.RespName
  57.                   
  58.                   
  59.                 UNION
  60.                 select 'Total' AS RespName, sum(gt._4Months) AS _4Months, sum(gt._3Months) AS _3Months, sum(gt._2Months) AS _2Months, sum(gt._1Month) AS _1Month, 1 AS union_order
  61.                                 from                      
  62.                                 (select r.RespName, count(four.ItemNo) AS _4Months,
  63.                                         COUNT(three.ItemNo) AS _3Months, count(two.ItemNo) AS _2Months,
  64.                                         count(one.ItemNo) AS _1Month, 0 AS union_order
  65.                                         from
  66.                                         IssueLog AS i
  67.                                 INNER JOIN
  68.                           RespCat AS r                     
  69.                           ON i.RespCatID = r.RespCatID                   
  70.                           LEFT JOIN
  71.                           (select i.ItemNo
  72.                              from IssueLog AS i
  73.                                INNER JOIN  
  74.                              RespCat AS r
  75.                                ON i.RespCatID = r.RespCatID
  76.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 4
  77.                              group by i.ItemNo, r.RespName
  78.                              ) AS four
  79.                           ON i.ItemNo = four.ItemNo
  80.                           LEFT JOIN
  81.                            (select i.ItemNo
  82.                              from IssueLog AS i
  83.                                INNER JOIN  
  84.                              RespCat AS r
  85.                                ON i.RespCatID = r.RespCatID
  86.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 3
  87.                              group by i.ItemNo, r.RespName
  88.                              ) AS three
  89.                           ON i.ItemNo = three.ItemNo
  90.                           LEFT JOIN
  91.                            (select i.ItemNo
  92.                              from IssueLog AS i
  93.                                INNER JOIN  
  94.                              RespCat AS r
  95.                                ON i.RespCatID = r.RespCatID
  96.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 2
  97.                              group by i.ItemNo, r.RespName
  98.                              ) AS two
  99.                           ON i.ItemNo = two.ItemNo
  100.                           LEFT JOIN
  101.                            (select i.ItemNo
  102.                              from IssueLog AS i
  103.                                INNER JOIN  
  104.                              RespCat AS r
  105.                                ON i.RespCatID = r.RespCatID
  106.                              where DATEDIFF(month, i.RespRaisedDate, GETDATE()) = 1
  107.                              group by i.ItemNo, r.RespName
  108.                              ) AS one
  109.                           ON i.ItemNo = one.ItemNo
  110.                           WHERE i.RespCatID != 1
  111.                           group by r.RespName) AS gt
  112.                          
  113.                           
  114.                   
  115.                    ) AS final
  116.                   ) AS finalall
  117.                   
  118.                  group by finalall.RespName, finalall._4Months, finalall._3Months, finalall._2Months, finalall._1Month, finalall.union_order
  119.                  order by finalall.union_order;
複製代碼

TOP

Thanks
仲有一條問題
如果Query中的 _4Months, _3Months 等想改做 03/2015, 02/2015, 01/2015, 12/2014
有 ...
luckiejacky 發表於 2015-4-13 17:27



    finalall._4Months AS "03/2015"

TOP

本帖最後由 luckiejacky 於 2015-4-14 17:47 編輯

It's very difficult to achieve, but how can I assign @retval3 to AS?
So the column names are the dates retrieved from the dynamic SQL?
  1. USE RCS;

  2. DECLARE @DateColumnsQuery3 NVARCHAR(MAX);
  3. DECLARE @retval3 NVARCHAR(MAX);   
  4. DECLARE @ParamDefin3 NVARCHAR(MAX);
  5. DECLARE @DateColumnNames3 NVARCHAR(MAX);

  6. SET @ParamDefin3 = N'@retvalOUT3 NVARCHAR(MAX) output';
  7. SET @DateColumnsQuery3 = N'Select @retvalOUT3 = DATEADD(month, -3, GETDATE())';                  
  8. EXEC sp_executesql @DateColumnsQuery3, @ParamDefin3, @retvalOUT3=@retval3 OUTPUT;


  9. Select @retval3;


  10.                            
  11. EXEC sp_executesql @DateColumnsQuery3, @ParamDefin3, @retvalOUT3=@retval3 OUTPUT;



  12. DECLARE @DateColumnsQuery2 NVARCHAR(MAX);
  13. DECLARE @retval2 NVARCHAR(MAX);   
  14. DECLARE @ParamDefin2 NVARCHAR(MAX);
  15. DECLARE @DateColumnNames2 NVARCHAR(MAX);

  16. SET @ParamDefin2 = N'@retvalOUT2 NVARCHAR(MAX) output';
  17. SET @DateColumnsQuery2 = N'Select @retvalOUT2 = DATEADD(month, -2, GETDATE())';                  
  18. EXEC sp_executesql @DateColumnsQuery2, @ParamDefin2, @retvalOUT2=@retval2 OUTPUT;

  19. Select @retval2;

  20. DECLARE @DateColumnsQuery1 NVARCHAR(MAX);
  21. DECLARE @retval1 NVARCHAR(MAX);   
  22. DECLARE @ParamDefin1 NVARCHAR(MAX);
  23. DECLARE @DateColumnNames1 NVARCHAR(MAX);

  24. SET @ParamDefin1 = N'@retvalOUT1 NVARCHAR(MAX) output';
  25. SET @DateColumnsQuery1 = N'Select @retvalOUT1 = DATEADD(month, -1, GETDATE())';                  
  26. EXEC sp_executesql @DateColumnsQuery1, @ParamDefin1, @retvalOUT1=@retval1 OUTPUT;

  27. Select @retval1;

  28. DECLARE @DateColumnsQuery0 NVARCHAR(MAX);
  29. DECLARE @retval0 NVARCHAR(MAX);   
  30. DECLARE @ParamDefin0 NVARCHAR(MAX);
  31. DECLARE @DateColumnNames0 NVARCHAR(MAX);

  32. SET @ParamDefin0 = N'@retvalOUT0 NVARCHAR(MAX) output';
  33. SET @DateColumnsQuery0 = N'Select @retvalOUT0 = DATEADD(month, -0, GETDATE())';                  
  34. EXEC sp_executesql @DateColumnsQuery0, @ParamDefin0, @retvalOUT0=@retval0 OUTPUT;


  35. Select @retval0;


  36. select final.RespName, final._3Months AS @retval, final._2Months AS @retval2 ,final._1Month AS @retval1 , final._0Month @retval0
  37.       from            
複製代碼

TOP

It's very difficult to achieve, but how can I assign @retval3 to AS?
So the column names are the dat ...
luckiejacky 發表於 2015-4-14 11:44


well i bet u need to run twice if u really want to achieve this,
btw why you need dynamic column name?

TOP