문제

나는 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
}

그리고 linq에서 피벗을 만드는 방법을 살펴보았습니다(여기 또는 여기) :

(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)
}

하지만 가능하다면 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)
        }
}
도움이 되었습니까?

해결책

이 질문에 대한 수락 된 답변을 확인하십시오.

열 이름을 생성하는 동적 SQL?

다른 팁

달력 기간(1-12) 또는 회계 기간(연도에 따라 1-12 또는 1-13)이 있습니까?

보고서를 1년 동안만 실행하시겠습니까?

가능하다면 PeriodId를 연도 및 기간의 두 필드로 나누겠습니다.이렇게 하면 특정 연도를 더 쉽게 선택할 수 있습니다.쿼리가 더 간단해집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top