如何分组,查找分组记录的最小值和计数

时间:2012-03-28 07:53:42

标签: sql tsql select group-by

我的表包含以下字段:

id  |   date_from  | date_to      |   price   |  status
----------------------------------------------------------
CK1     22-12-2012   29-12-2012       800         1
CK1     22-12-2012   29-12-2012       1200        1
CK2     24-12-2012   30-12-2012       1400        0
CK2     24-12-2012   30-12-2012       1800        1
CK2     24-12-2012   30-12-2012       2200        1

如何创建SQL选择按ID,DATE_FROM,DATE_TO对结果进行分组,并从状态== 1的价格中选择最低值,并计算分组的记录数量?

结果将是

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       2

也许有没有办法找出因状态== 0而未分组的记录数?这不是很重要,我只是想知道是否有办法找出记录组的数量不计数记录。

3 个答案:

答案 0 :(得分:2)

您的描述与您想要的结果不符。

这符合您的描述,即为您提供状态为1的最低价格,并计算该组中的记录数量:

select id, date_from, date_to, min(case status when 1 then price end) as price, count(*) as count
from TheTable
group by id, date_from, date_to

结果:

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       3

这将为您提供所要求的结果,即过滤掉状态为1的记录,获得最低价格,并在过滤后获取组中的记录数:

select id, date_from, date_to, min(price) as price, count(*) as count
from TheTable
where status = 1
group by id, date_from, date_to

结果:

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       2

要获取状态为0的记录数,您需要使用第一种方法,不过滤掉这些记录。如果状态只能是0或1,则只需使用sum(status)获取状态为1的记录数,并使用count(case status when 0 then 1 end)sum(1 - status)获取记录数状态为0。

答案 1 :(得分:0)

应该做的事情:

select ID, DATE_FROM, DATE_TO, MIN(price), COUNT(*) from my_table where satus = 1 group by ID, DATE_FROM, DATE_TO

一句话:ID字段可以具有相同的值是正常的吗?

MSDN article on "group by"以及另一个devguru

答案 2 :(得分:0)

也许是这样的:

测试数据

DECLARE @tbl TABLE
(
    id VARCHAR(100),
    date_from VARCHAR(100),
    date_to VARCHAR(100),
    price INT,
    status INT
)

INSERT INTO @tbl
VALUES
    ('CK1','22-12-2012','29-12-2012',800,1),
    ('CK1','22-12-2012','29-12-2012',1200,1),
    ('CK2','22-12-2012','29-12-2012',1400,0),
    ('CK2','22-12-2012','29-12-2012',1800,1),
    ('CK2','22-12-2012','29-12-2012',2200,1)

<强>查询

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY tbl.id ORDER BY tbl.price ASC) AS RowNbr,
        SUM(status) OVER(PARTITION BY tbl.id) AS [count],
        tbl.*
    FROM
        @tbl AS tbl
    WHERE
        status=1
)
SELECT
    CTE.id,
    CTE.date_from,
    CTE.date_to,
    CTE.price,
    CTE.[count]
FROM
    CTE
WHERE
    CTE.RowNbr=1