-1

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

ITEM_CREATION_DATE  ITEM_ID ITEM_TYPEID ITEM_FOLDER
2008-04-04 00:00:00.000 ITEM01  12  Y
2008-12-14 00:00:00.000 ITEM04  13  Y
2008-09-24 00:00:00.000 ITEM01  13  Y
2009-12-04 00:00:00.000 ITEM01  12  NULL
2009-04-09 00:00:00.000 ITEM02  13  NULL
2010-08-13 00:00:00.000 ITEM01  13  Y
2010-01-28 00:00:00.000 ITEM02  14  Y
2011-04-09 00:00:00.000 ITEM03  13  NULL
2011-10-19 00:00:00.000 ITEM01  12  NULL
2011-04-29 00:00:00.000 ITEM04  13  NULL
2011-02-19 00:00:00.000 ITEM01  13  NULL
2011-04-09 00:00:00.000 ITEM03  13  NULL
2012-02-29 00:00:00.000 ITEM01  14  Y
2012-12-09 00:00:00.000 ITEM03  14  Y
2012-07-19 00:00:00.000 ITEM01  14  Y
2012-06-29 00:00:00.000 ITEM01  12  Y
2012-04-29 00:00:00.000 ITEM03  NULL    Y
2012-04-19 00:00:00.000 ITEM03  NULL    Y
2013-04-09 00:00:00.000 ITEM01  13  Y
2013-09-14 00:00:00.000 ITEM01  13  Y
2013-05-24 00:00:00.000 ITEM01  12  Y
2013-01-09 00:00:00.000 ITEM01  12  Y
2013-11-09 00:00:00.000 ITEM01  14  Y
2013-09-21 00:00:00.000 ITEM01  12  Y
2013-07-09 00:00:00.000 ITEM02  14  Y
2013-08-09 00:00:00.000 ITEM02  NULL    Y
2013-09-09 00:00:00.000 ITEM02  NULL    Y

さまざまなアイテム タイプのアイテムの割合を取得する必要があります。ここでの課題は、1 つのクエリで同じことを達成することです。

次のような結果が必要です

Year     12     13      14  NULL
2008    33.33%      66.66%      0.00%   0.00%
2009    0.00%       0.00%       0.00%   0.00%
2010    0.00%       50%     50% 0.00%
2011    0.00%       0.00%       0.00%   0.00%
2012    16.66%      0.00%       50% 33.33%
2013    33.33%      22.22%      22.22%  22.22%

このクエリに取り組む最善の方法は Pivot です。そのため、私はその方向から始めました。私はこれらのタイプのクエリに非常に慣れていないので、専門家の助けが必要です.

さまざまなアイテムタイプのアイテム数を使用してクエリを取得できました

select *  from 
(
SELECT  YEAR(ITEM_CREATION_DATE) AS [Year], ITEM_ID, ITEM_TYPEID FROM [dbo].[ITEM_DETAIL] 
WHERE ITEM_FOLDER IS NOT NULL 
) AS Result pivot (count(ITEM_ID) for ITEM_TYPEID in ([12],[13],[14])) as MyTbl

アウトプット 年 12 13 14

2008    1       2       0
2010    0       1       1
2012    1       0       3
2013    3       2       2

しかし、ここでの問題は、残りの年 (つまり 2009 年と 2011 年) が where 句 (ITEM_FOLDER IS NOT NULL) に該当しないため、テーブルにすべての年が必要であるため、それらが欠落していることです。

また、クエリで NULL 項目タイプがフェッチされません。

これを解決する正しいアプローチがあるかどうか教えてください。ストアド プロシージャ内の複数の SQL で簡単に実行できます。しかし、それは私の場合、実行可能な解決策ではありません。目的の出力を得るには、単一の SQL クエリを実行する必要があります

PIVOT を使用すると、カウントまたはパーセンテージのみを取得できますが、両方を取得できないようです。

Year が NULL で ITEM_TYPE が NULL の場合、このような同じことを考慮に入れることはできますか

2008 12 1 33.33%
2008 13 2 66.66%
2009 12 1 50.00%
2009 13 1 50.00%
2010 13 1 50.00%
2010 14 1 50.00%
2011 12 1 20.00%
2011 13 4 80.00%
2012 ヌル 2 33.33%
2012 12 1 16.66%
2012 14 3 50.00%
2013 ヌル 2 22.22%
2013 12 3 33.33%
2013 13 2 22.22%
2013 14 2 22.22%



出力が正しくありません。

ITEM_FOLDER が null である年については、すべての項目タイプのカウントが 0 でなければなりません
また、1 つの項目タイプのレコードしかない場合は、残りのすべての項目タイプのカウントを 0 として表示する必要があります。

この下のように

YEAR ITEM_TYPE COUNT PERCENTAGE
2008 12 1 33.33
2008 13 2 66.67
2008 14 0 0.00
2009 12 0 0.00
2009 13 0 0.00
2009 14 0 0.00
2010 12 0 0.00
2010 13 1 50.00
2010 14 1 50.00
2011 12 0 0.00
2011 13 0 0.00
2011 14 0 0.00
2012 ヌル 2 33.33
2012 12 1 16.67
2012 13 0 0.00
2012 14 3 50.00
2013 ヌル 2 22.22
2013 12 3 33.33
2013 13 2 22.22
2013 14 2 22.22


4

1 に答える 1

0

これを試して

SELECT [Year],[12],[13],[14],[0] AS [NULL]  FROM 
(
    SELECT  YEAR(ITEM_CREATION_DATE) AS [Year]
    , CASE WHEN ITEM_FOLDER IS NOT NULL THEN ITEM_ID ELSE NULL END AS [ITEM_ID]
    , ISNULL(ITEM_TYPEID,0) AS ITEM_TYPEID FROM ITEM_DETAIL
) AS Result 
PIVOT 
(
    COUNT(ITEM_ID) for ITEM_TYPEID in ([12],[13],[14],[0])
) as MyTbl

デモはこちら

編集

パーセンテージについては、以下を確認してください

SELECT [Year]
    ,Convert(DECIMAL(8,2), [12]*100/Convert(DECIMAL(8,2),Total)) AS [12]
    ,Convert(DECIMAL(8,2), [13]*100/Convert(DECIMAL(8,2),Total)) AS [13]
    ,Convert(DECIMAL(8,2), [14]*100/Convert(DECIMAL(8,2),Total)) AS [14]
    ,Convert(DECIMAL(8,2), [NULL]*100/Convert(DECIMAL(8,2),Total)) AS [NULL] 
FROM
(
    SELECT [Year],[12],[13],[14],[0] AS [NULL],
    (SELECT COUNT(ITEM_ID) FROM #ITEM_DETAIL WHERE YEAR(ITEM_CREATION_DATE) = MyTbl.[Year] GROUP BY YEAR(ITEM_CREATION_DATE)) AS Total 
    FROM 
    (
        SELECT  YEAR(ITEM_CREATION_DATE) AS [Year]
        , CASE WHEN ITEM_FOLDER IS NOT NULL THEN ITEM_ID ELSE NULL END AS [ITEM_ID]
        , ISNULL(ITEM_TYPEID,0) AS ITEM_TYPEID FROM ITEM_DETAIL
    ) AS Result 
    PIVOT 
    (
        COUNT(ITEM_ID) for ITEM_TYPEID in ([12],[13],[14],[0])
    ) as MyTbl
) T

パーセンテージデモ

編集2

SELECT 
    [YEAR]
    ,ITEM_TYPEID
    ,CNT
    ,CONVERT(DECIMAL(8,2),CNT*100/CONVERT(DECIMAL(8,2),TOTAL)) AS PERCENTAGE 
FROM
(
    SELECT [YEAR],ITEM_TYPEID,SUM(CNT) AS CNT
    ,(SELECT COUNT(1) FROM #ITEM_DETAIL T1 WHERE YEAR(T1.ITEM_CREATION_DATE)=T.[YEAR]
         GROUP BY YEAR(ITEM_CREATION_DATE)) AS [TOTAL]
    FROM
    (
        SELECT  YEAR(ITEM_CREATION_DATE) AS [YEAR]
         , ISNULL(ITEM_TYPEID,'NULL') AS ITEM_TYPEID 
         , 1 AS CNT
        FROM #ITEM_DETAIL  
    ) T
    GROUP BY [YEAR],ITEM_TYPEID
) T1
ORDER BY [YEAR]

パーセンテージ デモ 2

SELECT [Year],C.itemtype,C.cnt,C.percentage FROM
(
    SELECT [Year],[12]
        ,Convert(DECIMAL(8,2), [12]*100/Convert(DECIMAL(8,2),Total)) AS [12p],[13]
        ,Convert(DECIMAL(8,2), [13]*100/Convert(DECIMAL(8,2),Total)) AS [13p],[14]
        ,Convert(DECIMAL(8,2), [14]*100/Convert(DECIMAL(8,2),Total)) AS [14p],[NULLv] 
        ,Convert(DECIMAL(8,2), [NULLv]*100/Convert(DECIMAL(8,2),Total)) AS [NULLp] 
    FROM
    (
        SELECT [Year],[12],[13],[14],[0] AS [NULLv],
        (SELECT COUNT(ITEM_ID) FROM #ITEM_DETAIL WHERE YEAR(ITEM_CREATION_DATE) = MyTbl.[Year] GROUP BY YEAR(ITEM_CREATION_DATE)) AS Total 
        FROM 
        (
            SELECT  YEAR(ITEM_CREATION_DATE) AS [Year]
            , CASE WHEN ITEM_FOLDER IS NOT NULL THEN ITEM_ID ELSE NULL END AS [ITEM_ID]
            , ISNULL(ITEM_TYPEID,0) AS ITEM_TYPEID FROM #ITEM_DETAIL
        ) AS Result 
        PIVOT 
        (
            COUNT(ITEM_ID) for ITEM_TYPEID in ([12],[13],[14],[0])
        ) as MyTbl
    ) T
) P
CROSS APPLY
(
    VALUES
    ('12',[12],[12p]),
    ('13',[13],[13p]),
    ('14',[14],[14p]),
    ('NULL',NULLv,[NULLp])
) C(itemtype,cnt,percentage)
WHERE C.itemtype <> 'NULL' OR C.cnt > 0 

パーセンテージ デモ 3

于 2013-07-10T05:42:48.573 に答える