0
テーブルの情報に基づいて、テーブルに動的な行数を挿入したいとします。表の値を使用して動的な行数を表に挿入できますか?
私は以下のコードを使用してそれを行うことができますが、ループを回避する方法があるかどうかは疑問です。
コメントアウトされたセクションは、私がしようとしていたときの私の最高の試みでしたが、それは私にエラーをもたらしました: "TOPへの引数、" OFFSET " FETCH句。外部スコープの列への参照のみ、またはスタンドアロンの式とサブクエリはここで許可されます。
DECLARE @TableX TABLE (
TDate DATE
, TType INT
, Fruit NVARCHAR(20)
, Vegetable NVARCHAR(20)
, Meat NVARCHAR(20)
, Bread NVARCHAR(20)
)
INSERT INTO @TableX VALUES
('2016-11-10',1,'Apple','Artichoke',NULL,NULL)
, ('2016-11-10',1,'Banana','Beet',NULL,NULL)
, ('2016-11-10',1,'Canteloupe','Cauliflower',NULL,NULL)
, ('2016-11-10',1,'Durian','Daikon',NULL,NULL)
, ('2016-11-10',2,NULL,NULL,'Rabbit','Rye')
, ('2016-11-10',2,NULL,NULL,'Sausage','Sourdough')
, ('2016-11-11',1,'Elderberry','Eggplant',NULL,NULL)
, ('2016-11-11',2,NULL,NULL,'Turkey','Tortilla')
, ('2016-11-11',2,NULL,NULL,'Venison','Vienna')
SELECT * FROM @TableX
DECLARE @BlankRow TABLE (
ID INT IDENTITY
, TDate DATE
, TType INT
, iCount INT
)
DECLARE @Counter1 INT = 0
, @RowCount INT
; WITH BR1
AS (
SELECT TDate, TType, COUNT(*) AS iCount
FROM @TableX
WHERE TType = 1
GROUP BY TDate, TType
)
, BR2
AS (
SELECT TDate, TType, COUNT(*) AS iCount
FROM @TableX
WHERE TType = 2
GROUP BY TDate, TType
)
INSERT INTO @BlankRow
SELECT ISNULL(BR1.TDate, BR2.TDate) AS TDate,
CASE WHEN ISNULL(BR1.iCount,0) < ISNULL(BR2.iCount,0) THEN 1 ELSE 2 END AS TType,
ABS(ISNULL(BR1.iCount,0) - ISNULL(BR2.iCount,0)) AS iCount
FROM BR1
FULL JOIN BR2
ON BR1.TDate = BR2.TDate
WHILE @Counter1 < (SELECT MAX(ID) FROM @BlankRow)
BEGIN
SET @Counter1 += 1
SET @RowCount = (SELECT iCount FROM @BlankRow WHERE ID = @Counter1)
INSERT INTO @TableX
SELECT TOP (@RowCount) tx.TDate, br.TType, NULL, NULL, NULL, NULL
FROM @TableX tx
LEFT JOIN @BlankRow br
ON tx.TDate = br.TDate
WHERE br.ID = @Counter1
END
/*INSERT INTO @TableX
SELECT TOP (tx.iCount) tx.TDate, br.TType, NULL, NULL, NULL, NULL
FROM @TableX tx
JOIN @BlankRow br
ON tx.TDate = br.TDate*/
SELECT *
FROM @TableX
ORDER BY TDate, TType,
ISNULL(Fruit,REPLICATE(CHAR(255),20)),
ISNULL(Vegetable,REPLICATE(CHAR(255),20)),
ISNULL(Meat,REPLICATE(CHAR(255),20)),
ISNULL(Bread,REPLICATE(CHAR(255),20))
データは、私が知っている、愚かですが、私の最終目標は、私のグループのヘッダは上の同じ場所に現れるように、同じ数の行で終わるReportBuilder 2つの異なるTablixの年代を持つことですページ。このような
エレガントで素晴らしいソリューションです。御時間ありがとうございます。 – DaveX
@DaveX心配しないで、あなたのためにうれしいよ:) – iamdave
私の例では、日付/タイプコンボのエントリがゼロである可能性は考慮されていません。私がこれを実装したとき、私はそれを実現しました。しかし、1行だけを挿入することは基本的なので、克服するのは難しくありませんでした。 (その日付に一致する他のタイプがない場合は日付/タイプのコンボを検索し、すべてのヌルなどを含む行を挿入します)。私が考えることを忘れて、尋ねることについてちょうど面白い謝罪。 – DaveX