Sql-Server

基於計數列 SQL Server 複製行

  • April 18, 2020

我有下表:

MyTable
PlaceID NameID  Code    CodeCount
1       1       1234A   2
1       2       1234A   3
1       3       1234A   1
2...
2...
3...
3...

我想選擇1234Awhere PlaceID= 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;

引用自:https://dba.stackexchange.com/questions/265336