クロス値を含むN-Nテーブルと(ピボット)に参加します
-
21-08-2019 - |
質問
私は3つのテーブルがあります:
TABLE MyColumn (
ColumnId INT NOT NULL,
Label VARCHAR(80) NOT NULL,
PRIMARY KEY (ColumnId)
)
TABLE MyPeriod (
PeriodId CHAR(6) NOT NULL, -- format yyyyMM
Label VARCHAR(80) NOT NULL,
PRIMARY KEY (PeriodId)
)
TABLE MyValue (
ColumnId INT NOT NULL,
PeriodId CHAR(6) NOT NULL,
Amount DECIMAL(8, 4) NOT NULL,
PRIMARY KEY (ColumnId, PeriodId),
FOREIGN KEY (ColumnId) REFERENCES MyColumn(ColumnId),
FOREIGN KEY (PeriodId) REFERENCES MyPeriod(PeriodId)
)
MyValueの行が唯一の真の値が与えられたときに作成されます。
私は、表のように私の結果が欲しいです
Column | Month 1 | Month 2 | Month 4 | Month 5 |
Potatoes | 25.00 | 5.00 | 1.60 | NULL |
Apples | 2.00 | 1.50 | NULL | NULL |
私は正常クロスに参加作成しました
SELECT
MyColumn.Label AS [Column],
MyPeriod.Label AS [Period],
ISNULL(MyValue.Amount, 0) AS [Value]
FROM
MyColumn CROSS JOIN
MyPeriod LEFT OUTER JOIN
MyValue ON (MyValue.ColumnId = MyColumn.ColumnId AND MyValue.PeriodId = MyPeriod.PeriodId)
また、LINQでます:
from p in MyPeriods
from c in MyColumns
join v in MyValues on new { c.ColumnId, p.PeriodId } equals new { v.ColumnId, v.PeriodId } into values
from nv in values.DefaultIfEmpty()
select new {
Column = c.Label,
Period = p.Label,
Value = nv.Amount
}
そして(ここのか
(仮定MyDatasは、前のクエリの結果の図である)
from c in MyDatas
group c by c.Column into line
select new
{
Column = line.Key,
Month1 = line.Where(l => l.Period == "Month 1").Sum(l => l.Value),
Month2 = line.Where(l => l.Period == "Month 2").Sum(l => l.Value),
Month3 = line.Where(l => l.Period == "Month 3").Sum(l => l.Value),
Month4 = line.Where(l => l.Period == "Month 4").Sum(l => l.Value)
}
しかし、私は可能であれば、でResultSetを作成する方法を見つけたい、MONTH1、...プロパティの動的ます。
注:N + 1つのクエリを生じる溶液
from c in MyDatas
group c by c.Column into line
select new
{
Column = line.Key,
Months =
from l in line
group l by l.Period into period
select new
{
Period = period.Key,
Amount = period.Sum(l => l.Value)
}
}
解決
この質問への受け入れ答えをチェックします:
他のヒント
あなたはカレンダーの期間(1-12)または会計期間(年によっては1-12または1-13)を持っていますか?
あなたは1年間のみレポートを実行しますか?
可能であれば、私は年&期間の2つのフィールドにPeriodIdを破ります。これは、簡単に特定の年を選択するようになります。クエリが簡単になります。
所属していません StackOverflow