【问题标题】:Select count by new items added in the past month按过去一个月添加的新项目选择计数
【发布时间】:2018-03-09 16:49:35
【问题描述】:

我有以下 SQL 表...

Country_ID | Country  |
-----------------------
     1     | France   |
     2     | England  |
     3     | Germany  |
     4     | Scotland |
-----------------------


WorkList_ID | Places | DateOfCreation |
----------------------------------------
     1     | France   |    01/02/2018  |
     2     | England  |    11/01/2018  |
     3     | Germany  |    21/02/2018  |
     1     | France   |    13/03/2017  |
     2     | England  |    21/01/2018  |
     4     | Scotland |    04/03/2018  |
     2     | England  |    08/02/2018  |
     3     | Germany  |    13/03/2017  |
     1     | France   |    09/02/2018  |
     2     | England  |    11/03/2017  |
---------------------------------------

使用国家/地区键来链接表格。如何生成下表:

Country    | Total Count  | New From Last month  |
--------------------------|----------------------
  France   |     3        |        1         |
  England  |     4        |        2         |
  Germany  |     2        |        1         |
  Scotland |     1        |        0         |
--------------------------------------------------

我想显示工作列表的总数以及上个月添加的所有新列表?

这是我目前所拥有的:

  (SELECT Places, COUNT(Places) as 'Outstanding List'

  FROM WorkList
  WHERE Places IN 

  (SELECT Country  FROM tblCountry)

  GROUP BY Places)

【问题讨论】:

  • 你如何定义“上个月”?
  • 作为一个有用的提示,在提供日期时,请以确定的格式提供。我们中的一些人不能使用这些数据,因为一年中没有 13 个月。 yyyyMMdd 是最首选的格式。 :)
  • 上个月是从今天开始的 1 个月前。
  • 只是为了澄清日期格式是 DD/MM/YYYY 但我很抱歉没有说清楚。

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


【解决方案1】:

这应该可以完成工作。只是一个简单的LEFT JOIN,您可以使用上个月的CASE 表达式:

USE Sandbox;
GO

CREATE TABLE #Country (Country_ID int, Country varchar(10));
INSERT INTO #Country
VALUES (1,'France'),
       (2,'England'),
       (3,'Germany'),
       (4,'Scotland');

CREATE TABLE #Worklist (WorkList_ID int, Places varchar(10), DateOfCreation date);
INSERT INTO #Worklist
SELECT Id, Place, CONVERT(date, Creation,103)
FROM (VALUES (1,'France','01/02/2018'),
             (2,'England','11/01/2018'),
             (3,'Germany','21/02/2018'),
             (1,'France','13/03/2017'),
             (2,'England','21/01/2018'),
             (4,'Scotland','04/03/2018'),
             (2,'England','08/02/2018'),
             (3,'Germany','13/03/2017'),
             (1,'France','09/02/2018'),
             (2,'England','11/03/2017')) WL(ID, Place, Creation);
GO
SELECT C.Country,
       COUNT(WL.WorkList_ID) AS Total,
       COUNT(CASE WHEN DateOfCreation >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1,0) AND DateOfCreation < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0) THEN WL.WorkList_ID END) AS LastMonth
FROM #Country C
     LEFT JOIN #Worklist WL ON C.Country = WL.Places
GROUP BY C.Country

GO
DROP TABLE #Country;
DROP TABLE #Worklist;

【讨论】:

    【解决方案2】:
    SELECT  COUNTRY,
            TOT.TOTAL [TOTAL COUNT],
            LAST.TOTAL [NEW FROM LAST MONTH]
    FROM tblCountry T
    LEFT JOIN
    (SELECT Places, COUNT(Places) TOTAL
    FROM WorkList W
    INNER JOIN tblCountry C ON C.Country = W.Places
    WHERE W.DateOfCreation BETWEEN DATEADD(MONTH, -1, GETDATE()) AND GETDATE()
    GROUP BY Places) TOT ON TOT.PLACES = T.COUNTRY
    LEFT JOIN
    (SELECT Places, COUNT(Places) TOTAL
    FROM WorkList W
    INNER JOIN tblCountry C ON C.Country = W.Places
    GROUP BY Places) LAST ON LAST.PLACES = T.COUNTRY
    

    【讨论】:

      【解决方案3】:

      我使用了左连接,以防您有一些国家还没有任何新的国家。这样,即使没有完成任何订单,您也可以列出所有国家/地区。

      SELECT Country, NVL(pt.total_count,0), NVL(nt.new_count,0)
      FROM country_table cl
      LEFT JOIN (SELECT worklist _id, 
            count(worklist_id) as total_count 
            FROM places_table 
            GROUP BY worklist_id) pt ON pt.worklist_id = cl.country_id
      LEFT JOIN (SELECT worklist _id, 
           count(worklist_id) as new_count 
           FROM places_table 
           WHERE dataofcreate > yourdate  
           GROUP BY worklist_id) nt ON nt.worklist_id = cl.country_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 1970-01-01
        • 2015-10-19
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多