Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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 Server行数_Sql_Sql Server_Count - Fatal编程技术网

在同一个表中多次使用内部联接返回SQL Server行数

在同一个表中多次使用内部联接返回SQL Server行数,sql,sql-server,count,Sql,Sql Server,Count,我有这个密码 select count(cat_item_tb.item_id), count(t.item_id) from cat_tb inner join item_tb on cat_tb.cat_id = item_tb.cat_id inner join cat_item_tb on item_tb.item_id = cat_item_tb.item_id and t.ss = 0 inner join cat_item_t

我有这个密码

select 
    count(cat_item_tb.item_id),
    count(t.item_id) 
from 
    cat_tb 
inner join
    item_tb on cat_tb.cat_id = item_tb.cat_id
inner join
    cat_item_tb on item_tb.item_id = cat_item_tb.item_id and t.ss = 0
inner join
    cat_item_tb t on item_tb.item_id = t.item_id and t.ss = 1
所有我需要返回的值没有重复。在过去的代码中,每次计数必须返回7,但返回49。这两个
count()
相互影响。我使用distinct,但它不会返回正确的计数,因为表中有(item_id)多次


非常感谢

如果我正确理解了任务,您可以使用groub by获得所需的结果

select count(cat_item_tb.item_id), cat_item_tb.ss
from cat_tb 
inner join item_tb on cat_tb.cat_id = item_tb.cat_id
inner join cat_item_tb on item_tb.item_id = cat_item_tb.item_id 
where t.ss = 0 or t.ss = 1
group by cat_item_tb.ss
查询将返回两行,第一列包含计数值。


关于分组依据的更多信息在这里

在我看来,您需要计算不同的值,以计算唯一的值

... 
count(DISTINCT cat_item_tb.item_id) 
...

查询中的两个计数将相同。这仅仅是因为您在这些项目的id上进行了内部连接。因此,它们在防御上是相同的。

我相信你想写一些类似于:

select 
    count(c1.item_id),
    count(c2.item_id) 
from 
    cat_tb                  as a
    inner join item_tb      as b    on ( a.cat_id = b.cat_id )
    inner join cat_item_tb  as c1   on ( b.item_id = c1.item_id ) and ( c1.ss = 0 )
    inner join cat_item_tb  as c2   on ( b.item_id = c2.item_id ) and ( c2.ss = 1 )
由于内部联接,这将不起作用。如果c1的第一个连接返回3行,c2的第二个连接返回4行,那么最终的结果是count=3*4

试试这个:

;with cte1 as (
    select
        b.item_id, 
        'c1_count' = count( c1.item_id ) 
    from
        item_tb                 as b
        left join cat_item_tb  as c1   on ( b.item_id = c1.item_id ) and ( c1.ss = 0 )        
    group by
        b.item_id
),
cte2 as (
    select 
        b.item_id,
        'c2_count' = count(c2.item_id) 
    from 
        item_tb                 as b        
        left join cat_item_tb  as c2   on ( b.item_id = c2.item_id ) and ( c2.ss = 1 )
    group by
        b.item_id
)
select
    a.item_id, a.c1_count, b.c2_count
from
    cte1            as a
    inner join cte2 as b on ( b.item_id = a.item_id )

出于性能原因,如果您确定
目录中的
项目tb
中有
行具有项目id,并且所有
行都将
ss
列设置为0或1,则可以将CTE中的
左联接
替换为
内部联接

示例和所需的结果将非常有用。当连接两侧有多个值相同的行时,这是意料之中的。因此,这是您的数据,而不是查询。请注意7*7=49;-)