Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不要包含记录,除非它是SQL中某项的唯一记录_Sql - Fatal编程技术网

不要包含记录,除非它是SQL中某项的唯一记录

不要包含记录,除非它是SQL中某项的唯一记录,sql,Sql,我有一个事务表,如果某个记录发生了什么事情,就会应用一个标志。举个例子,拿支笔。如果有人计算了我们有多少支笔,它会创建一个记录,其中项为'pen',日期为'1/1/15',标志为c,表示已计算。然后,也许其他人会拿一支笔,它会插入一个记录项='pen',一个日期='2/15/15',标志='t'。然后我们需要笔,所以有人订购笔,它会插入一个记录项='pen',日期='3/12/15',标志='o' 所以现在我想知道笔上是否有交易发生,但我不在乎它是否被计算过,这很简单。从标记为“c”的表中选择*

我有一个事务表,如果某个记录发生了什么事情,就会应用一个标志。举个例子,拿支笔。如果有人计算了我们有多少支笔,它会创建一个记录,其中项为'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')