Tsql 重复相同的数据一定次数

Tsql 重复相同的数据一定次数,tsql,Tsql,我遇到了一个问题,如果没有对代码进行深入的修改,我似乎无法解决这个问题,我认为一定有一个更简单的解决方案,我根本不知道 我有一个产品名称、产品位置和各种状态的表格(从1到10)。我有所有产品和位置的数据,但只有一些状态(例如XX市的产品X有类别1和3的数据,YY市的产品Y有类别1到6的数据) 我希望始终显示每个产品/位置的10个重复,以及相应的数据(如果有)或空值。这使得我计划创建的报告更易于阅读和理解 我正在SQL Server 2016上使用SSMS2017 SELECT [Product

我遇到了一个问题,如果没有对代码进行深入的修改,我似乎无法解决这个问题,我认为一定有一个更简单的解决方案,我根本不知道

我有一个产品名称、产品位置和各种状态的表格(从1到10)。我有所有产品和位置的数据,但只有一些状态(例如XX市的产品X有类别1和3的数据,YY市的产品Y有类别1到6的数据)

我希望始终显示每个产品/位置的10个重复,以及相应的数据(如果有)或空值。这使得我计划创建的报告更易于阅读和理解

我正在SQL Server 2016上使用SSMS2017

SELECT 
[Product],
[Location],
[Category],
[Week1],
[Week2],
[Week3]
FROM MyView

当然,它只会返回我拥有的数据,但我希望总是返回每个产品/位置组合的所有10行(如果我没有数据,则在周列中为空)。

你的问题不是很清楚,但我认为,我的魔法水晶球给了我一个很好的猜测:

我认为,您正在寻找
左连接
交叉连接

--下次请自己创建一个这样的独立示例
--我用示例数据创建了3个虚拟表

DECLARE @tblStatus TABLE(ID INT IDENTITY,StatusName VARCHAR(100));
INSERT INTO @tblStatus VALUES('Status 1')
                            ,('Status 2')
                            ,('Status 3')
                            ,('Status 4')
                            ,('Status 5');
DECLARE @tblGroup TABLE(ID INT IDENTITY,GroupName VARCHAR(100));
INSERT INTO @tblGroup VALUES ('Group 1')
                            ,('Group 2')
                            ,('Group 3')
                            ,('Group 4')
                            ,('Group 5');
DECLARE @tblProduct TABLE(ID INT IDENTITY,ProductName VARCHAR(100),StatusID INT, GroupID INT);
INSERT INTO @tblProduct VALUES ('Product 1, Status 1, Group 2',1,2)
                              ,('Product 2, Status 1, Group 3',1,3)
                              ,('Product 3, Status 3, Group 4',3,4)
                              ,('Product 4, Status 3, Group 3',3,3)
                              ,('Product 5, Status 1, Group 5',1,5);
--这将返回每个状态(与产品值无关)以及产品(如果有相应的行)

--这将首先使用
交叉联接
创建一个带有每个笛卡尔积的each。
--
左连接
的工作原理如上所述

SELECT s.StatusName
      ,g.GroupName
      ,p.*
FROM @tblStatus s
CROSS JOIN @tblGroup g
LEFT JOIN @tblProduct p ON s.ID=p.StatusID AND g.ID=p.GroupID;

如果这不是您需要的,请尝试建立一个像我这样的示例,并提供预期的输出

你的问题有点让人困惑,想要的结果会很有帮助。也就是说,我怀疑你在寻找某种交叉连接。请阅读一些关于改进你的问题的提示。您是否有一个包含所有状态值的表?一旦我们有了DDL和样本数据,它将变得更清晰,例如
外部连接
合并
可能足以合并现有和“缺失”数据。样本数据和您的预期结果将是一个巨大的帮助。谢谢-下次我将确保提供样本数据。我的问题现在解决了——一个数字为1-10的小CTE和交叉/左连接的组合。我怀疑我们永远不会知道真正的问题是什么。任何一个case+1都是为了消磨时间,并提供有用的提示。相反,@John,你会知道:)这正是我非常需要的,两个连接之间的一种解决方法。我最终创建了数字从1到10的CTE,将其与表中不同的产品和位置列表交叉连接,并将其与原始表连接到该结构。谢谢你的帮助,Shnugo,下次我会尽力用更复杂的方式描述这个问题。@DamianR你的问题比复杂的问题更模糊。提供样本数据和预期结果至关重要,它消除了错误假设和“兔子洞”。如果这个问题没有引起Shnugo的注意(我是Shnugo的超级粉丝),我怀疑它仍然没有得到回答。干杯
SELECT s.StatusName
      ,g.GroupName
      ,p.*
FROM @tblStatus s
CROSS JOIN @tblGroup g
LEFT JOIN @tblProduct p ON s.ID=p.StatusID AND g.ID=p.GroupID;