0

spending購入アイテム、購入時間、購入金額、購入したアカウントを定義するいくつかの基本フィールドを含むテーブルがあります: spItemspAmountspDateおよびspAccount

一度に 1 つのアカウントで、月ごとにそれらをグループ化するクエリを作成しました。これは正常に機能します。

SELECT YEAR(spDate) as spYear,
       MONTH(spDate) as spMonth,
       SUM(spAmount) AS TotalAmount
FROM spending
WHERE spAccount like 'Bank1'
GROUP BY YEAR(spDate), MONTH(spDate)
ORDER BY YEAR(spDate), MONTH(spDate)

SELECT YEAR(spDate) as spYear,
       MONTH(spDate) as spMonth,
       SUM(spAmount) AS TotalAmount
FROM spending
WHERE spAccount like 'Bank2'
GROUP BY YEAR(spDate), MONTH(spDate)
ORDER BY YEAR(spDate), MONTH(spDate)

Bank1両方のクエリを組み合わせて、 1 つの列とBank2次の列に表示できる 1 つのテーブルを取得しようとしています。アカウントの 1 つが支出されない月があるかもしれません。この場合、スキップするだけでなく、ゼロの値を表示する必要があります。

私を正しい方法で指摘できる人は誰でも大歓迎です。

4

4 に答える 4

0

あなたの質問を正しく理解できたと思います:-)

利用可能な月と年 (少なくとも 1 つのアカウントにデータが存在する場合) ごとに、各アカウントの合計を表示します (そのうちの 1 つが 0 であっても)。これを行うために、2 つのクエリを結合し、ISNULL 関数を使用して正しいソースからデータを取得しました。

ダミーデータを使用した私のソリューションは次のとおりです。

--Preparing Dummy Data
;WITH spending
 AS (SELECT '01-01-2010' spDate, 
            100          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '01-01-2010' spDate, 
            200          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '03-01-2010' spDate, 
            150          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '04-01-2010' spDate, 
            500          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '01-01-2010' spDate, 
            200          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '03-01-2010' spDate, 
            10           spamount, 
            'Bank2'      spaccount 
     UNION 
     SELECT '05-01-2010' spDate, 
            800          spamount, 
            'Bank2'      spaccount 
     UNION 
     SELECT '03-01-2010' spDate, 
            110          spamount, 
            'Bank2'      spaccount 
     UNION 
     SELECT '01-01-2010' spDate, 
            100          spamount, 
            'Bank2'      spaccount) 
--End of Dummy Data

--Start Query on Dummy Data
SELECT ISNULL(Bank1.SPMONTH, Bank2.SPMONTH) AS spMonth, 
       ISNULL(Bank1.SPYEAR, Bank2.SPYEAR)   AS spYear, 
       ISNULL(Bank1.TOTALAMOUNT, 0)         AS TotalAmount_Bank1, 
       ISNULL(Bank2.TOTALAMOUNT, 0)         AS TotalAmount_Bank2 
FROM   (SELECT YEAR(SPDATE)  AS spYear, 
               MONTH(SPDATE) AS spMonth, 
               SUM(SPAMOUNT) AS TotalAmount 
        FROM   spending 
        WHERE  SPACCOUNT LIKE 'Bank1' 
        GROUP  BY YEAR(SPDATE), 
                  MONTH(SPDATE)) AS Bank1 
       FULL JOIN (SELECT YEAR(SPDATE)  AS spYear, 
                         MONTH(SPDATE) AS spMonth, 
                         SUM(SPAMOUNT) AS TotalAmount 
                  FROM   spending 
                  WHERE  SPACCOUNT LIKE 'Bank2' 
                  GROUP  BY YEAR(SPDATE), 
                            MONTH(SPDATE)) AS Bank2 
              ON Bank1.SPMONTH = Bank2.SPMONTH 
                 AND Bank2.SPYEAR = Bank2.SPYEAR 
ORDER  BY SPYEAR, 
          SPMONTH 
于 2012-10-03T09:05:57.073 に答える
0

年と月を組み合わせて 1 つのフィールドとして日付を選択し、それに応じて並べ替えてグループ化します。また、SQL でのグループ化の順序が重要であるため、最初にアカウントでグループ化するようにしてください。

于 2012-10-03T00:34:35.830 に答える
0

グループ化と条件付き集計を使用して、1 つのクエリで両方のアカウントの合計を取得できます。これは次のようになります。

SELECT YEAR(spDate) as spYear,
       MONTH(spDate) as spMonth,
       SUM(CASE spAccount WHEN 'Bank1' THEN spAmount ELSE 0 END) AS Bank1,
       SUM(CASE spAccount WHEN 'Bank2' THEN spAmount ELSE 0 END) AS Bank2
FROM spending
WHERE spAccount IN ('Bank1', 'Bank2')
GROUP BY YEAR(spDate), MONTH(spDate)
ORDER BY YEAR(spDate), MONTH(spDate)
;
于 2012-10-03T10:26:08.563 に答える
0
SELECT YEAR(spDate) as spYear, MONTH(spDate) as spMonth, SUM(spAmount) AS TotalAmount,(SELECT SUM(spAmount) AS TotalAmount2 FROM spending WHERE spAccount like 'Bank2' GROUP BY YEAR(spDate), MONTH(spDate) ORDER BY YEAR(spDate), MONTH(spDate)) FROM spending WHERE spAccount like 'Bank1' GROUP BY YEAR(spDate), MONTH(spDate) ORDER BY YEAR(spDate), MONTH(spDate)
于 2012-10-03T00:48:20.190 に答える