请在下面查看我的查询和结果

(SELECT count(*) as Count, p.regionid, a.territory,
CASE WHEN DATEPART(day,p.prodate) < 8 THEN '1'
  ELSE CASE WHEN DATEPART(day,p.prodate) < 15 then '2'
    ELSE CASE WHEN  DATEPART(day,p.prodate) < 22 then '3'
      ELSE CASE WHEN  DATEPART(day,p.prodate) < 29 then '4'
       ELSE '5'
      END
    END
  END
END as WeekNumber
from pros p
inner join
GTS_Account a
on a.locationGTSNo = p.BillToCustNo
  where a.account like '%abc%' and
  p.prodate between '2014-02-01' and '2014-02-28'
group by p.ProDate,p.regionid,a.territory)

结果
╔═══════╦══════════╦═══════════╦════════════╗
║ Count ║ regionid ║ territory ║ WeekNumber ║
╠═══════╬══════════╬═══════════╬════════════╣
║     3 ║ LTL      ║         2 ║          1 ║
║    23 ║ RDFS     ║         2 ║          1 ║
║    10 ║ VOLUME   ║         2 ║          1 ║
║    22 ║ RDFS     ║         2 ║          1 ║
║    10 ║ VOLUME   ║         2 ║          1 ║
║     1 ║ EXP      ║         2 ║          2 ║
║     3 ║ LTL      ║         2 ║          2 ║
║    25 ║ RDFS     ║         2 ║          2 ║
║    11 ║ VOLUME   ║         2 ║          2 ║
║     1 ║ BRK      ║         2 ║          2 ║
║     6 ║ VOLUME   ║         2 ║          2 ║
║     1 ║ BRK      ║         2 ║          3 ║
║     4 ║ EXP      ║         2 ║          3 ║
║     1 ║ LTL      ║         2 ║          3 ║
║    20 ║ RDFS     ║         2 ║          3 ║
║     4 ║ EXP      ║         2 ║          4 ║
║     4 ║ LTL      ║         2 ║          4 ║
║    30 ║ RDFS     ║         2 ║          4 ║
║    15 ║ VOLUME   ║         2 ║          4 ║
╚═══════╩══════════╩═══════════╩════════════╝

这显示了一周中每一天的数据,我只是希望它显示每个区域/每周而不是每天的总数。谢谢

3-13-14
我想显示此数据的月份和年份列,请查询下面的内容,每个区域/周应该只显示一行。
SELECT convert(nvarchar,DATEPART(YYYY,p.prodate))  + ' ' +
CASE WHEN DATEPART(month,p.prodate) = 1 THEN 'JAN'
    WHEN DATEPART(month,p.prodate) = 2 THEN 'FEB'
    WHEN DATEPART(month,p.prodate) = 3 THEN 'MAR'
    WHEN DATEPART(month,p.prodate) = 4 THEN 'APR'
    WHEN DATEPART(month,p.prodate) = 5 THEN 'MAY'
    WHEN DATEPART(month,p.prodate) = 6 THEN 'JUN'
    WHEN DATEPART(month,p.prodate) = 7 THEN 'JUL'
    WHEN DATEPART(month,p.prodate) = 8 THEN 'AUG'
    WHEN DATEPART(month,p.prodate) = 9 THEN 'SEP'
    WHEN DATEPART(month,p.prodate) = 10 THEN 'OCT'
    WHEN DATEPART(month,p.prodate) = 11 THEN 'NOV'
    WHEN DATEPART(month,p.prodate) = 12 THEN 'DEC'
    ELSE '6'
    END AS MONTHnAME,
count(*) as Count, p.regionid,
CASE WHEN DATEPART(day,p.prodate) < 8 THEN '1' --+ ' ' +convert(nvarchar,DATEPART(mm,p.prodate))
     WHEN DATEPART(day,p.prodate) < 15 then '2' --+ ' ' +convert(nvarchar,DATEPART(mm,p.prodate))
    WHEN  DATEPART(day,p.prodate) < 22 then '3' --+ ' ' +convert(nvarchar,DATEPART(mm,p.prodate))
    WHEN  DATEPART(day,p.prodate) < 29 then '4'  --+ ' ' +convert(nvarchar,DATEPART(mm,p.prodate))
    ELSE '5' + ' ' +convert(nvarchar,DATEPART(mm,p.prodate))
END as WeekNumber,a.territory,'rrts' from pros p inner join GTS_Account a on a.locationGTSNo = p.BillToCustNo
  where a.account like '%rrts%' and
  p.prodate between '2014-02-01' and '2014-02-28' group by
  CASE
            WHEN Datepart(day, p.prodate) < 8 THEN '1'
            WHEN Datepart(day, p.prodate) < 15 THEN '2'
            WHEN Datepart(day, p.prodate) < 22 THEN '3'
            WHEN Datepart(day, p.prodate) < 29 THEN '4'
            ELSE '5'
          END
  ,p.prodate,a.territory, p.regionid
  order by p.regionid, weeknumber

MONTHnAME Count regionid WeekNumber 领土(无列名)
2014 年 2 月 1 日 BRK 1 0002 rrts
2014 年 2 月 1 日 BRK 2 0002 rrts
2014 年 2 月 1 日 BRK 2 0002 rrts
2014 年 2 月 1 日 BRK 3 0002 rrts
2014 年 2 月 2 日 BRK 4 0002 rrts
2014 年 2 月 1 日 BRK 4 0002 rrts
2014 年 2 月 1 日 DED 3 0002 rrts
2014 年 2 月 3 日 EXP 1 0002 rrts
2014 年 2 月 1 日 EXP 1 0002 rrts
2014 年 2 月 2 日 EXP 1 0002 rrts
2014 年 2 月 3 日 EXP 1 0002 rrts
2014 年 2 月 2 日 EXP 1 0002 rrts
2014 年 2 月 1 日 EXP 2 0002 rrts
2014 年 2 月 1 日 EXP 2 0002 rrts
2014 年 2 月 2 日 EXP 2 0002 rrts
2014 年 2 月 1 日 EXP 2 0002 rrts
2014 年 2 月 4 日 EXP 3 0002 rrts
2014 年 2 月 1 日 EXP 3 0002 rrts
2014 年 2 月 6 日 EXP 3 0002 rrts
2014 年 2 月 3 日 EXP 3 0002 rrts
2014 年 2 月 7 日 EXP 3 0002 rrts
2014 年 2 月 1 日 EXP 4 0002 rrts
2014 年 2 月 4 日 EXP 4 0002 rrts
2014 年 2 月 2 日 EXP 4 0002 rrts
2014 年 2 月 3 日 EXP 4 0002 rrts

最佳答案

您只需要按您选择的相同内容而不是 p.prodate 进行分组

此外,您不需要嵌套的 case 语句,只需多个 WHEN

SELECT Count(*) AS Count,
       p.regionid,
       a.territory,
       CASE
         WHEN Datepart(day, p.prodate) < 8 THEN '1'
         WHEN Datepart(day, p.prodate) < 15 THEN '2'
         WHEN Datepart(day, p.prodate) < 22 THEN '3'
         WHEN Datepart(day, p.prodate) < 29 THEN '4'
         ELSE '5'
       END      AS WeekNumber
FROM   pros p
       INNER JOIN gts_account a
               ON a.locationgtsno = p.billtocustno
WHERE  a.account LIKE '%abc%'
       AND p.prodate BETWEEN '2014-02-01' AND '2014-02-28'
GROUP  BY CASE
            WHEN Datepart(day, p.prodate) < 8 THEN '1'
            WHEN Datepart(day, p.prodate) < 15 THEN '2'
            WHEN Datepart(day, p.prodate) < 22 THEN '3'
            WHEN Datepart(day, p.prodate) < 29 THEN '4'
            ELSE '5'
          END,
          p.regionid,
          a.territory

如果你的 case 语句很糟糕,你也可以使用 with 子句让它更干净一点
WITH cte
     AS (SELECT
                p.regionid,
                a.territory,
                CASE
                  WHEN Datepart(day, p.prodate) < 8 THEN '1'
                  WHEN Datepart(day, p.prodate) < 15 THEN '2'
                  WHEN Datepart(day, p.prodate) < 22 THEN '3'
                  WHEN Datepart(day, p.prodate) < 29 THEN '4'
                  ELSE '5'
                END AS WeekNumber
         FROM   pros p
                INNER JOIN gts_account a
                        ON a.locationgtsno = p.billtocustno
         WHERE  a.account LIKE '%abc%'
                AND p.prodate BETWEEN '2014-02-01' AND '2014-02-28')
SELECT Count(*) As Count,
       regionid,
       territory,
       weeknumber
FROM   cte
GROUP  BY weeknumber,
          regionid,
          territory

关于SQL Server 按周分组查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22356147/

10-13 09:03