Sql-Server
基於計數列 SQL Server 複製行
我有下表:
MyTable PlaceID NameID Code CodeCount 1 1 1234A 2 1 2 1234A 3 1 3 1234A 1 2... 2... 3... 3...
我想選擇
1234A
wherePlaceID
= 1,次數等於CodeCount
. 因此,結果將是這樣的六行:MyResult Code 1234A 1234A 1234A 1234A 1234A 1234A
最終,這個選擇將有一堆不同的程式碼用於單個
PlaceID
. 是的,我知道我在複製數據,最後它不會很多,我將在下面解釋我為什麼要這樣做。首先,我需要得到計數的總和:
DECLARE @cdcnt INT = (SELECT SUM(CodeCount) FROM MyTable WHERE PlaceID = 1 AND Code = '1234A')
然後我可以將此值用作while循環中的控制項來多次選擇該值:
DECLARE @i INT = 0; WHILE @i < @cdcnt BEGIN SELECT DISTINCT Code FROM MyTable WHERE PlaceID = 1 AND Code = '1234A' SET @i = @i + 1 END
問題是我得到 6 個單獨的選擇,而不是 6 行的一個選擇。如何創建
MyResult
如上所示,而不是 6 個單獨的選擇?為什麼我這樣做:我想使用一個隨機數生成器來選擇一個
Code
它出現在每個集合中的頻率PlaceID
(還會Codes
添加其他的,我仍在弄清楚如何只做一個)。我願意接受有關不同方法的建議,但這是我能弄清楚的唯一方法。如果已經建構了一個功能來根據設定的頻率從列表中進行選擇,我會全力以赴。
下面是一個使用連接到計數 CTE 的範例。最好創建一個具體化的計數/數字表來促進此類任務的進行並提高性能。
WITH t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n)) ,tally AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c) ,codes AS (SELECT Code, SUM(CodeCount) AS CodeCount FROM dbo.MyTable WHERE Code = '1234A' AND PlaceID = 1 GROUP BY Code) SELECT Code FROM codes JOIN tally ON tally.num <= codes.CodeCount;