1

テーブルの特定の行が結果セットの列である結果セットを作成するために使用する必要があるテーブルがあります。テーブルで s を複数回チェーンし始めましたLEFT JOINが、既にセットにある別の結果の異なる組み合わせである結果を排除する必要があります。

たとえば、結果列として 1、21、25 を取得した場合、結果にこれらの数値の他の組み合わせを含めることはできません。

私のテーブル定義は次のとおりです。

Table tblKPIDetails
Column Month int
Column Year int
Column Division varchar(3)
Column KPI int
Column Value decimal(18,4)

私の現在のクエリは次のとおりです。

SELECT *
FROM tblKPIDetails J1
    LEFT JOIN tblKPIDetails J2 ON J2.Month = J1.Month AND J2.Year = J1.Year  AND J2.Division = J1.Division AND NOT(J2.KPI = J1.KPI ) AND (J2.KPI = 1 OR J2.KPI = 21 OR J2.KPI = 25)
    LEFT JOIN tblKPIDetails J3 ON J3.Month = J1.Month AND J3.Year = J1.Year  AND J3.Division = J1.Division AND NOT(J3.KPI = J1.KPI ) AND (J3.KPI = 1 OR J3.KPI = 21 OR J3.KPI = 25)
WHERE J1.KPI = 1 OR J1.KPI = 21 OR J1.KPI = 25

これが間違っていることはわかっていますが、必要なもののスーパーセットです。上記のクエリの結果では、J1.KPI、J2.KPI、J3.KPI または J1.KPI、J3.KPI、J2.KPI、またはその他の組み合わせを取得できます。

私の期待される結果は次のようになります。

Division | Month | Year | KPIA | KPIAValue | KPIB | KPIBValue | KPIC | KPICValue

部門別、月別、年別

ここで、KPIA、KPIB、または KPIC = 1、21、または 25 ですが、部門|月|年ごとに 1、21、25 の組み合わせは 1 つだけ存在します。

編集

予想される結果をもう少し明確にするために、上記のクエリを使用すると、次の結果が得られます。

Division | Month | Year | KPIA | KPIAValue | KPIB | KPIBValue | KPIC | KPICValue
--------------------------------------------------------------------------------
000          1     2012     1      1000       21      2000       25     3000
000          1     2012    21      2000        1      1000       25     3000
000          1     2012    25      3000       21      2000        1     1000
111          1     2012     1      555        21      10000      25     5000

結果が最初の3つの結果のいずれか1つになり、次に最後の結果になるようにする必要があります...例:

Division | Month | Year | KPIA | KPIAValue | KPIB | KPIBValue | KPIC | KPICValue
--------------------------------------------------------------------------------
000          1     2012    25      3000       21      2000        1     1000
111          1     2012     1      555        21      10000      25     5000
4

4 に答える 4

2

PIVOT私はあなたがそのようなテーブル演算子を探していると思います:

SELECT 
  Devision,
  Month, 
  Year,
  [1]  AS KPIAValue,
  [21] AS KPIBValue,
  [25] AS KPICValue
FROM
(
  SELECT t1.*
  FROM tblKPIDetails t1
  INNER JOIN
  (
    SELECT Month, Year, Devision
    FROM tblKPIDetails
    WHERE KPI IN(1, 21, 25)
    GROUP BY Month, Year, Devision
    HAVING COUNT(DISTINCT KPI) = 3
  ) t2 ON t1.Month = t2.Month AND t1.Year = t2.Year 
  AND t1.Devision = t2.Devision
) t
PIVOT
(
  MAX(Value)
  FOR KPI IN([1], [21], [25])) p;

SQLフィドルデモ

これにより、次の形式のデータが得られます。

| DEVISION | MONTH | YEAR | KPIAVALUE | KPIBVALUE | KPICVALUE |
---------------------------------------------------------------
|        A |     2 | 2012 |        16 |        16 |        16 |
|        B |    10 | 2012 |        16 |        18 |        20 |

注:これにより、すべての値が1、21、および25である、、の唯一の組み合わせが得られ、このクエリの機能は次のようになりYearます。MonthDEVISION

SELECT Month, Year, Devision
FROM tblKPIDetails
WHERE KPI IN(1, 21, 25)
GROUP BY Month, Year, Devision
HAVING COUNT(DISTINCT KPI) = 3

更新: 1、21、または25の少なくとも1つを持つものを探している場合は、を削除するだけHAVING COUNT(DISTINCT KPI) = 3ですが、これにより、これら3つよりも多くの値が期待されます。この場合、他の値は無視され、これら3つのみが返されます。NULLまた、次のように、欠落している値のいずれかが返されます。

SELECT 
  Devision,
  Month, 
  Year,
  [1]  AS KPIAValue,
  [21] AS KPIBValue,
  [25] AS KPICValue
FROM
(
  SELECT t1.*
  FROM tblKPIDetails t1
  INNER JOIN
  (
    SELECT Month, Year, Devision
    FROM tblKPIDetails
    WHERE KPI IN(1, 21, 25)
    GROUP BY Month, Year, Devision
  ) t2 ON t1.Month = t2.Month AND t1.Year = t2.Year 
  AND t1.Devision = t2.Devision
) t
PIVOT
(
  MAX(Value)
  FOR KPI IN([1], [21], [25])) p;

更新されたSQLフィドルデモ

| DIVISION | MONTH | YEAR | KPIAVALUE | KPIBVALUE | KPICVALUE |
---------------------------------------------------------------
|        A |     2 | 2012 |      15.5 |      15.5 |      15.5 |
|        B |    10 | 2012 |      15.5 |      17.5 |     20.24 |
|        C |    12 | 2012 |      15.5 |    (null) |     20.24 |
于 2012-12-28T20:09:09.203 に答える
0

多分あなたは以下を試すことができます:

SELECT DISTINCT
t.Division,
t.Month, 
t.Year,
KA.Value  AS KPIAValue,
KB.Value AS KPIBValue,
KC.Value AS KPICValue
FROM
tblKPIDetails t
LEFT JOIN tblKPIDetails KA ON t.Division = KA.Division and t.Month = KA.month and  .year = KA.year and KA.KPI = 1
LEFT JOIN tblKPIDetails KB ON t.Division = KB.Division and t.Month = KB.month and t.year = KB.year and KB.KPI = 21
LEFT JOIN tblKPIDetails KC ON t.Division = KC.Division and t.Month = KC.month and t.year = KC.year and KC.KPI = 25

次に、必要なKPI値ごとに1つのLEFTJOINがあります。

于 2012-12-28T21:45:59.860 に答える
0

多数の「ID」がない場合は、次のように値を転置することができます。

select 
[Month],
[Year],
Division,
sum(case when KPI = 1 then Value else null end) as KPI1,
sum(case when KPI = 21 then Value else null end) as KPI21,
sum(case when KPI = 25 then Value else null end) as KPI25
from tblKPIDetails
group by 
[Month],
[Year],
Division
order by 
[Month],
[Year],
Division

または、「OVER」句を使用して同じことを行います。

于 2012-12-28T20:22:18.750 に答える
0

条件付き集計が必要だと思います。しかし、結果がどのように定義されているのかはまだはっきりしていません。これはあなたの途中であなたを助けるかもしれません:

SELECT Division, Month, Year,
       1, max(case when kpi = 1 then value end) as kpi1value,
       21, max(case when kpi = 21 then value end) as kpi21value, 
       25, max(case when kpi = 25 then value end) as kpi25value,
FROM tblKPIDetails J1
于 2012-12-28T20:22:27.977 に答える