我的表包含以下字段:
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而未分组的记录数?这不是很重要,我只是想知道是否有办法找出记录组的数量不计数记录。
答案 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字段可以具有相同的值是正常的吗?
答案 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