不要包含记录,除非它是SQL中某项的唯一记录
我有一个事务表,如果某个记录发生了什么事情,就会应用一个标志。举个例子,拿支笔。如果有人计算了我们有多少支笔,它会创建一个记录,其中项为'pen',日期为'1/1/15',标志为c,表示已计算。然后,也许其他人会拿一支笔,它会插入一个记录项='pen',一个日期='2/15/15',标志='t'。然后我们需要笔,所以有人订购笔,它会插入一个记录项='pen',日期='3/12/15',标志='o' 所以现在我想知道笔上是否有交易发生,但我不在乎它是否被计算过,这很简单。从标记为“c”的表中选择*。这就是我被困的地方。我们有铅笔,其中唯一存在的交易是已计算的交易 我需要一个查询来显示除计数外的其他事务发生的位置,除非存在的唯一事务是其已计数 这就是我想要的输出:不要包含记录,除非它是SQL中某项的唯一记录,sql,Sql,我有一个事务表,如果某个记录发生了什么事情,就会应用一个标志。举个例子,拿支笔。如果有人计算了我们有多少支笔,它会创建一个记录,其中项为'pen',日期为'1/1/15',标志为c,表示已计算。然后,也许其他人会拿一支笔,它会插入一个记录项='pen',一个日期='2/15/15',标志='t'。然后我们需要笔,所以有人订购笔,它会插入一个记录项='pen',日期='3/12/15',标志='o' 所以现在我想知道笔上是否有交易发生,但我不在乎它是否被计算过,这很简单。从标记为“c”的表中选择*
Pen 2/15/15 T
Pen 3/12/15 O
Pencil 1/1/15 C
每个不同的项目/日期组合需要一行或多行 每个不同组合一行:
SELECT DISTINCT Item, `Date`
FROM table
每个非“c”交易一行:
SELECT Item, [Date], Flag
FROM table
WHERE Flag <> 'c'
在SQLServer2005+中,您可以
WITH s
AS (SELECT *,
COUNT(CASE
WHEN [Flag] <> 'C' THEN 1
END)
OVER(
PARTITION BY [Item] ) AS NonC_Count
FROM Stationery)
SELECT Item,
Date,
Flag
FROM s
WHERE [Flag] <> 'C'
OR NonC_Count = 0;
尝试组计数:
select item, date, flag
from
(
select item, date, flag,
count(*) over (partition by item) as cnt
from tab
) as dt
where (cnt > 1 and flag <> 'C')
or (cnt = 1 and flag = 'C')
请澄清:应用标志意味着什么?当事务发生时,您的程序是向表中插入新行,还是更新现有行?很抱歉,它会向表中插入新记录。因此,对于pens,将存在3条记录。但铅笔只有一支。表中有哪些列?您希望在结果集中包含哪些列?请编辑您的问题并使其更清楚,现在很难理解它是如何编写的。您使用的是什么RDBMS?e、 SQL Server,MySQL,Oracle…@MartinSmith:正确。你的查询逻辑正确:-我删除了那条评论,因为问题模棱两可,在单数和复数之间切换。
WITH s
AS (SELECT *,
COUNT(CASE
WHEN [Flag] <> 'C' THEN 1
END)
OVER(
PARTITION BY [Item] ) AS NonC_Count
FROM Stationery)
SELECT Item,
Date,
Flag
FROM s
WHERE [Flag] <> 'C'
OR NonC_Count = 0;
select item, date, flag
from
(
select item, date, flag,
count(*) over (partition by item) as cnt
from tab
) as dt
where (cnt > 1 and flag <> 'C')
or (cnt = 1 and flag = 'C')