【问题标题】:SQL Server - can't do COUNT on DATEDIFF without doing CREATE VIEWSQL Server - 不能在不做 CREATE VIEW 的情况下对 DATEDIFF 做 COUNT
【发布时间】:2009-11-28 08:58:14
【问题描述】:

我正在尝试获取有关两个日期的差异以及该差异发生频率的一些信息。我可以使用:

SELECT 
   DATEDIFF (day, db1.dbo.t1.Date1, db2.dbo.t2.Date2) AS Days
FROM 
   db1.dbo.t1 
JOIN 
   db2.dbo.t2 ON db1.dbo.t1.wID = db2.dbo.t2.cID
              AND db1.dbo.t1.Action LIKE 'Standard'
              AND db2.dbo.t2.Status = 'CLOSED'

它会返回:

Days
-----
4
4
8
21
16
42
...

现在我想统计一下那些日子,比如:

Days    Diff
-----   -----
0       100
1       40
2       22
3       25
...

我在数据库中没有创建视图的权限,所以我在想一个嵌套语句,例如:

SELECT 
    Days, COUNT (*) AS Diff
FROM 
    Days
WHERE EXISTS 
(
SELECT DATEDIFF (day, db1.dbo.t1.Date1, db2.dbo.t2.Date2) AS Days
FROM db1.dbo.t1 JOIN db2.dbo.t2
ON db1.dbo.t1.wID = db2.dbo.t2.cID
AND db1.dbo.t1.Action LIKE 'Standard'
AND db2.dbo.t2.Status = 'CLOSED'
)
GROUP BY Days

但我不断收到错误消息 207 和 208!

请告诉我我做错了什么。我一直在搜索和尝试各种事情,但到目前为止,我能想到的只是我需要为“db1.dbo.t1 JOIN db2.dbo.t2”提供一个别名,这样我就可以用以下方式调用它:

SELECT Days, COUNT (*) AS Diff
FROM new_dual_db_alias
WHERE EXISTS 

谢谢,

【问题讨论】:

    标签: sql-server sql-server-2005-express


    【解决方案1】:

    我认为 - 虽然我无法快速测试:

    SELECT Days, COUNT(Days) FROM
    (
    SELECT 
        DATEDIFF (day, db1.dbo.t1.Date1, db2.dbo.t2.Date2) AS Days
    FROM
        db1.dbo.t1 JOIN db2.dbo.t2 ON db1.dbo.t1.wID = db2.dbo.t2.cID AND 
                                      db1.dbo.t1.Action LIKE 'Standard' AND 
                                      db2.dbo.t2.Status = 'CLOSED'
    )
    GROUP BY Days
    

    【讨论】:

      【解决方案2】:

      在 SQL Server 2005 及更高版本上,您还可以使用 CTE(Common Table Express)

      WITH DateDiffDays AS
      (
        SELECT 
           DATEDIFF (day, db1.dbo.t1.Date1, db2.dbo.t2.Date2) AS Days
        FROM 
           db1.dbo.t1 
        JOIN 
           db2.dbo.t2 ON db1.dbo.t1.wID = db2.dbo.t2.cID
        WHERE
           db1.dbo.t1.Action LIKE 'Standard'
           AND db2.dbo.t2.Status = 'CLOSED'
      )
      SELECT Days, COUNT(*)
      FROM DateDiffDays
      GROUP BY Days
      ORDER BY COUNT(*)
      

      CTE 类似于“动态视图”,仅对下一条语句有效。

      这对你有用吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 2015-01-07
        相关资源
        最近更新 更多