【问题标题】:Write a query to count different kind of records in single line result编写查询以计算单行结果中不同类型的记录
【发布时间】:2015-05-21 06:18:53
【问题描述】:

我在MS SQLSERVER 中有一个包含 2 列 TimeStamp 和 ID 的表

TimeStamp      ID
2015-05-20      1
2015-05-20      2
2015-05-20      1
2015-05-21      1
2015-05-21      2
2015-05-21      2
2015-05-21      1

我的要求是根据日期计算每个 ID 的记录数。

要求:

Date           No of records for Id=1           No. records for ID=2            Total
2015-05-20         2                                     1                        3
2015-05-21         2                                     2                        4

请让我知道如何为其他列执行此操作。

谢谢

【问题讨论】:

  • 是 2008 r2 还是 2012?你不知道你正在使用什么版本的 sql server 吗?如果您同时需要它们,请选择最旧的,因为它的解决方案可能也适用于较新的。另外,请阅读 Pivot
  • 为想要测试他们的解决方案的人创造了一个小提琴:sqlfiddle.com/#!3/8c28c/1
  • 一般你不会在数据库中这样做。您将按日期和 ID 分组计数以获取行,然后让您的报告/消费者弄清楚如何呈现它。动态 SQL 会损害性能和安全性。此外,这种方法可能会导致您可能会用完列(正如其他人所说)。这些数据的目的地是什么?

标签: sql sql-server sql-server-2008-r2 group-by sql-server-2012


【解决方案1】:

使用 Pivot - 看起来像这样:

SELECT  [TimeStamp], [1] AS [No of records for Id=1], [2] AS [No of records for Id=2], [1]+[2] AS Total
FROM    dbo.YourTable
        PIVOT
        (
            COUNT(ID) FOR ID IN ([1],[2])
        ) pvt
ORDER BY [TimeStamp]

【讨论】:

【解决方案2】:

为了完成动态方式:

DECLARE @id_values NVARCHAR(MAX)
DECLARE @stmt NVARCHAR(MAX)

SET  @id_values = ''
SET  @stmt = ''

--Get List of ID's
SELECT  @id_values = @id_values + ',[' + CAST(ID AS VARCHAR) + ']'
FROM    dbo.YourTable
GROUP BY ID

SET @id_values = RIGHT(@id_values, LEN(@id_values)-1) --Remove Leading Comma

--Build PIVOT Statement
SET @stmt = 'SELECT [TimeStamp],' + @id_values + ','+ REPLACE(@id_values,',','+') + ' AS Total
            FROM    dbo.YourTable
                    PIVOT
                    (
                        COUNT(ID) FOR ID IN (' + @id_values + ')
                    ) pvt
            ORDER BY [TimeStamp]'


--Execute
EXEC sp_executesql @stmt

【讨论】:

    【解决方案3】:

    我已经使用子查询得到了你的答案:

    SQLFIDDLE:http://sqlfiddle.com/#!3/8c28c/5

    SELECT DISTINCT t1.myts, 
                    (SELECT COUNT(*)
                     FROM mytable t2
                     WHERE t2.myts = t1.myts
                     AND t2.id = 1) AS id_1_count,
                    (SELECT COUNT(*)
                     FROM mytable t2
                     WHERE t2.myts = t1.myts
                     AND t2.id = 2) AS id_2_count,
                    (SELECT COUNT(*)
                     FROM mytable t2
                     WHERE t2.myts = t1.myts) AS total
    FROM mytable t1
    

    如果你在这里添加一个 id,虽然你需要另一个子查询

    【讨论】:

    • 这可能会显示正确的结果,但最终会导致性能非常差......它不是可读的代码,也不是动态的......
    • 我不是在争论性能或动态,但它怎么不可读?如果你把缩进正确,它应该是完全可读的
    • 也许在旁观者的眼中 ;-) 查询设计,新行,小写,大写关键字,缩进,......让我们说这是某种艺术 - 有些喜欢,有些喜欢不是,每个人都有自己的风格和喜好
    猜你喜欢
    • 2017-10-17
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多