【问题标题】:How can I count times solely from one column in T-SQL?如何仅从 T-SQL 中的一列计算时间?
【发布时间】:2014-10-13 21:11:06
【问题描述】:

目前,我在下面有这个查询,它产生了很棒的结果,但是,我正在尝试计算 SiteID 的总数(无论查询中的其他因素如何)。

这是我目前的查询:

SELECT 
    TotalCharts ,
    SiteID ,
    Type,
    CASE
        WHEN TotalCharts BETWEEN 1 AND 4 THEN '1-4 Charts'  
        WHEN TotalCharts BETWEEN 5 AND 9 THEN '5-9 Charts'  
        WHEN TotalCharts BETWEEN 10 AND 24 THEN '10-24 Charts'  
        WHEN TotalCharts BETWEEN 25 AND 49 THEN '25-49 Charts'  
        WHEN TotalCharts BETWEEN 50 AND 99 THEN '50-99 Charts'  
        WHEN TotalCharts BETWEEN 100 AND 249 THEN '100-249 Charts'  
        WHEN TotalCharts BETWEEN 250 AND 499 THEN '250-499 Charts'  
        WHEN TotalCharts BETWEEN 500 AND 1000 THEN '500-1000 Charts'  
        WHEN TotalCharts > 1000 THEN 'Greater 1000'
    END AssignmentType,
    CASE
        WHEN TotalCharts BETWEEN 1 AND 4 THEN '1'  
        WHEN TotalCharts BETWEEN 5 AND 9 THEN '2'  
        WHEN TotalCharts BETWEEN 10 AND 24 THEN '3'  
        WHEN TotalCharts BETWEEN 25 AND 49 THEN '4'  
        WHEN TotalCharts BETWEEN 50 AND 99 THEN '5'  
        WHEN TotalCharts BETWEEN 100 AND 249 THEN '6'  
        WHEN TotalCharts BETWEEN 250 AND 499 THEN '7'  
        WHEN TotalCharts BETWEEN 500 AND 1000 THEN '8'  
        WHEN TotalCharts > 1000 THEN '9'
    END AssignmentTypeIndex
FROM (
    SELECT
    COUNT(c.ChartID) TotalCharts,
    c.SiteID, 
    CASE WHEN ChartRetrievalMethodID IS NULL THEN wfseg.SiteEventGroupID
ELSE ChartRetrievalMethodID END as Type
FROM
    dbo.Sites s 
    INNER JOIN dbo.Charts c ON s.SiteID = c.SiteID
    LEFT JOIN dbo.ChartRetrievalInformation cri ON c.ChartID=cri.ChartID
    LEFT JOIN dbo.WFSiteEvents wfse ON s.SiteID = wfse.SiteID AND EventStatusID IN (1,2)
    LEFT JOIN dbo.WFSiteEventTypes wfset ON wfse.EventTypeID = wfset.EventTypeID
    LEFT JOIN dbo.WFSiteEventGroups wfseg ON wfset.SiteEventGroupID = wfseg.SiteEventGroupID
WHERE
    c.SiteID <> 110
    and s.ProjectID=160
GROUP BY
    c.SiteID, 
    CASE WHEN ChartRetrievalMethodID IS NULL THEN wfseg.SiteEventGroupID
ELSE ChartRetrievalMethodID END
) d
ORDER BY SiteID

所以现在它正在显示单个站点 ID,我想显示完整的站点 ID 计数

但是,我认为这里真正使用count(distinct siteID) 的棘手部分是因为同一站点ID 有包含各种信息的行。示例:

TotalCharts | SiteID | SiteEventGroupID | AssignmentType | AssignmentTypeIndex
-------------------------------------------------------------------------------
9           | 12345  | 4                | 5-9 Charts     | 2
-------------------------------------------------------------------------------
1           | 12345  | 3                | 1-4 Charts     | 1 

因此,在这种情况下,同一个 SiteID 有两个不同的行,我只想计算这个特定的 SiteID,而不考虑其他信息。因此,我希望它只计算一次,而不是计算这个 SiteID 两次。

有没有一种方法可以让我只计算那个特定的列?

【问题讨论】:

    标签: sql sql-server tsql count


    【解决方案1】:

    在这种情况下,您需要的是一个窗口函数。 下面是 TSQL 窗口函数的参考:http://msdn.microsoft.com/en-ca/library/ms189461.aspx

    修改现有代码块:

    SELECT
        TotalCharts,
        SiteID,
        Type, 
        AssignmentType,
        AssignmentTypeIndex,
        COUNT(SiteID) OVER (PARTITION BY SiteID) NumRowsbySite
    FROM(
        SELECT 
            TotalCharts ,
            SiteID,     
            Type,
            CASE
                WHEN TotalCharts BETWEEN 1 AND 4 THEN '1-4 Charts'  
                WHEN TotalCharts BETWEEN 5 AND 9 THEN '5-9 Charts'  
                WHEN TotalCharts BETWEEN 10 AND 24 THEN '10-24 Charts'  
                WHEN TotalCharts BETWEEN 25 AND 49 THEN '25-49 Charts'  
                WHEN TotalCharts BETWEEN 50 AND 99 THEN '50-99 Charts'  
                WHEN TotalCharts BETWEEN 100 AND 249 THEN '100-249 Charts'  
                WHEN TotalCharts BETWEEN 250 AND 499 THEN '250-499 Charts'  
                WHEN TotalCharts BETWEEN 500 AND 1000 THEN '500-1000 Charts'  
                WHEN TotalCharts > 1000 THEN 'Greater 1000'
            END AssignmentType,
            CASE
                WHEN TotalCharts BETWEEN 1 AND 4 THEN '1'  
                WHEN TotalCharts BETWEEN 5 AND 9 THEN '2'  
                WHEN TotalCharts BETWEEN 10 AND 24 THEN '3'  
                WHEN TotalCharts BETWEEN 25 AND 49 THEN '4'  
                WHEN TotalCharts BETWEEN 50 AND 99 THEN '5'  
                WHEN TotalCharts BETWEEN 100 AND 249 THEN '6'  
                WHEN TotalCharts BETWEEN 250 AND 499 THEN '7'  
                WHEN TotalCharts BETWEEN 500 AND 1000 THEN '8'  
                WHEN TotalCharts > 1000 THEN '9'
            END AssignmentTypeIndex
        FROM (
            SELECT
            COUNT(c.ChartID) TotalCharts,
            c.SiteID, 
            CASE WHEN ChartRetrievalMethodID IS NULL THEN wfseg.SiteEventGroupID
        ELSE ChartRetrievalMethodID END as Type
        FROM
            dbo.Sites s 
            INNER JOIN dbo.Charts c ON s.SiteID = c.SiteID
            LEFT JOIN dbo.ChartRetrievalInformation cri ON c.ChartID=cri.ChartID
            LEFT JOIN dbo.WFSiteEvents wfse ON s.SiteID = wfse.SiteID AND EventStatusID IN (1,2)
            LEFT JOIN dbo.WFSiteEventTypes wfset ON wfse.EventTypeID = wfset.EventTypeID
            LEFT JOIN dbo.WFSiteEventGroups wfseg ON wfset.SiteEventGroupID = wfseg.SiteEventGroupID
        WHERE
            c.SiteID <> 110
            and s.ProjectID=160
        GROUP BY
            c.SiteID, 
            CASE WHEN ChartRetrievalMethodID IS NULL THEN wfseg.SiteEventGroupID
        ELSE ChartRetrievalMethodID END
        ) d
        ORDER BY SiteID) a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多