Sql server 理解结合一个例子

Sql server 理解结合一个例子,sql-server,tsql,join,Sql Server,Tsql,Join,我一直在尝试通过以下在SQLServer中构建的示例来完全理解连接 DECLARE @tablePlace TABLE (ID INT, someplace varchar(10)) DECLARE @tableType TABLE (ID INT, sometype varchar(10)) DECLARE @tableOrders TABLE (ID INT, type int , place int) INSERT INTO @tablePlace (ID, someplace) val

我一直在尝试通过以下在SQLServer中构建的示例来完全理解连接

DECLARE @tablePlace TABLE (ID INT, someplace varchar(10))
DECLARE @tableType TABLE (ID INT, sometype varchar(10))
DECLARE @tableOrders TABLE (ID INT, type int , place int)

INSERT INTO @tablePlace (ID, someplace) values (1,'Place A')
INSERT INTO @tablePlace (ID, someplace) values (2,'Place B')

INSERT INTO @tableType (ID, sometype) VALUES (1,'Type 1')
INSERT INTO @tableType (ID, sometype) VALUES (2,'Type 2')
INSERT INTO @tableType (ID, sometype) VALUES (3,'Type 3')
INSERT INTO @tableType (ID, sometype) VALUES (4,'Type 4')

INSERT INTO @tableOrders (ID, place, type) values (1 , 1 , 1)  -- PLACE A TYPE 1
INSERT INTO @tableOrders (ID, place, type) values (2 , 1 , 2)  -- PLACE A TYPE 2
INSERT INTO @tableOrders (ID, place, type) values (3 , 2 , 2)  -- PLACE B TYPE 2
现在我要做的是链接这三个表以得到以下结果

╔═════════╦════════╦═══════╗
║  PLACE  ║  TYPE  ║ COUNT ║
╠═════════╬════════╬═══════╣
║ PLACE A ║ TYPE 1 ║     1 ║
║ PLACE A ║ TYPE 2 ║     1 ║
║ PLACE A ║ TYPE 3 ║     0 ║
║ PLACE A ║ TYPE 4 ║     0 ║
║ PLACE B ║ TYPE 1 ║     0 ║
║ PLACE B ║ TYPE 2 ║     1 ║
║ PLACE B ║ TYPE 3 ║     0 ║
║ PLACE B ║ TYPE 4 ║     0 ║
╚═════════╩════════╩═══════╝
所以我要做的是将这两个地方链接起来,并根据从
@tableorders
表检索到的记录显示每种类型的计数


到目前为止,我的问题是:

SELECT place.someplace,
       type.sometype,
       Count(*) AS count
FROM   @tableOrders orders
       INNER JOIN @tableplace place
               ON orders.place = place.id
       INNER JOIN @tabletype type
               ON place.id = type.id
GROUP  BY someplace,
          sometype
ORDER  BY someplace,
          sometype  
有人能解释一下我应该遵循什么逻辑来达到我想要的结果吗?提前谢谢

您需要交叉连接来生成行。然后
左连接
(或相关子查询)以获取值:

select p.someplace, t.sometype, count(o.id) as count
from @tableplace p cross join
     @tabletype t left join
     @tableOrders o
     on o.type = t.id and o.place = p.id 
group by p.someplace, t.sometype
order by p.someplace, t.sometype;

使用
交叉连接
生成MxN表(使用类型连接所有位置),然后将
左连接
到orders表以获取每对的计数
(someplace,sometype)


试试这个:

SELECT place.someplace, [type].sometype , T.cnt
FROM @tablePlace place
CROSS join @tabletype [type] 
OUTER APPLY 
(   SELECT COUNT(1) cnt
    FROM @tableOrders tableOrders 
    WHERE tableOrders.place=place.ID AND tableOrders.[type] = [type].ID
)T
ORDER BY someplace,sometype
Place A Type 1  1
Place A Type 2  1
Place A Type 3  0
Place A Type 4  0
Place B Type 1  0
Place B Type 2  1
Place B Type 3  0
Place B Type 4  0
输出:

SELECT place.someplace, [type].sometype , T.cnt
FROM @tablePlace place
CROSS join @tabletype [type] 
OUTER APPLY 
(   SELECT COUNT(1) cnt
    FROM @tableOrders tableOrders 
    WHERE tableOrders.place=place.ID AND tableOrders.[type] = [type].ID
)T
ORDER BY someplace,sometype
Place A Type 1  1
Place A Type 2  1
Place A Type 3  0
Place A Type 4  0
Place B Type 1  0
Place B Type 2  1
Place B Type 3  0
Place B Type 4  0
试试这个:

SELECT A.someplace,B.sometype,COUNT(C.ID) count_val FROM @tablePlace A CROSS JOIN 
@tableType B LEFT JOIN @tableOrders C ON C.place = A.ID AND C.type = B.ID 
GROUP BY someplace,sometype
希望有帮助。:)