簡體   English   中英

將表中的數據合並到一行T-SQL

[英]Combine data from a table to one row T-SQL

我在#SQL server 2008中有一個包含事務數據的表。 該表看起來像這樣。 我想在sql語句中有這個。

TRANSACTIONID | TransactionDate | TRANSACTIONTYPE |金額|資產|用戶ID

交易類型可以是四種類型之一:存款,取款,利潤和股權。 我舉一個例子說明它在事務表中的樣子。 余額是金額總和列。

TransactionId|TransactionDate|TransactionType|Amount|Balance|UserId
1|             2013-03-25|      Deposit|         150|    150|     1
2|             2013-03-27|      Stake|           -20|    130|     1
3|             2013-03-28|      Profit |         1500|   1630|    1
4 |            2013-03-29|      Withdrawals|     -700|   930|     1
5|             2013-03-29|      Stake |          -230 |  700 |    1
6|             2013-04-04|      Stake|           -150 |  550|     1
7|             2013-04-06|      Stake |          -150 |  400|     1

我現在想要的是獲得一個select語句,它為我提供按周分組的所有數據。 結果應該是這樣的。

Week|Deposit|Withdrawals|Stake|Profit|Balance|Year
13 |  150|     -700  |      -250 | 1500 |  700 |    2013
14 |  0  |     0     |      -300|  0   |   400 |    2013

我也有幾周的問題......我住在歐洲一個星期的第一天是星期一。 我有一個解決方案,但在一年結束時,我有時會得到54周,但一年只有52周......

我希望有人可以幫助我。

這就是我到目前為止所擁有的。

SELECT transactionid, 
       transactiondate, 
       transactiontype, 
       amount, 
       (SELECT Sum(amount) 
        FROM   transactions AS trans_ 
        WHERE  trans_.transactiondate <= trans.transactiondate 
               AND userid = 1)         AS Balance, 
       userid, 
       Datepart(week, transactiondate) AS Week, 
       Datepart(year, transactiondate) AS Year 
FROM   transactions trans 
WHERE  userid = 1 
ORDER  BY transactiondate DESC, 
          transactionid DESC 

這里的示例數據和我對sql-fiddle的查詢: http ://www.sqlfiddle.com/#!3/79d65 / 92/0

為了將行中的數據轉換為列,您將需要使用PIVOT函數。

您沒有指定要返回的balance值,但根據最終結果,您希望最終余額為與每天的最后交易日期相關聯的值。 如果這不正確,那么請說明邏輯應該是什么。

為了獲得結果,您將需要使用DATEPARTYEAR函數。 這些將允許按周和年值進行分組。

以下查詢應該獲得您想要的結果:

select week, 
  coalesce(Deposit, 0) Deposit, 
  coalesce(Withdrawals, 0) Withdrawals, 
  coalesce(Stake, 0) Stake, 
  coalesce(Profit, 0) Profit,
  Balance,
  Year
from
(
  select datepart(week, t1.transactiondate) week,
    t1.transactiontype,
    t2.balance,
    t1.amount,
    year(t1.transactiondate) year
  from transactions t1
  cross apply
  (
    select top 1 balance 
    from transactions t2
    where datepart(week, t1.transactiondate) = datepart(week,  t2.transactiondate)
      and year(t1.transactiondate) = year(t2.transactiondate)
      and t1.userid = t2.userid
    order by TransactionId desc
  ) t2
) d
pivot
(
  sum(amount)
  for transactiontype in (Deposit, Withdrawals, Stake, Profit)
) piv;

請參閱SQL Fiddle with Demo 結果是:

| WEEK | DEPOSIT | WITHDRAWALS | STAKE | PROFIT | BALANCE | YEAR |
------------------------------------------------------------------
|   13 |     150 |        -700 |  -250 |   1500 |     700 | 2013 |
|   14 |       0 |           0 |  -300 |      0 |     400 | 2013 |

作為附注,你說你的星期一是星期一,你可能必須使用DATEFIRST函數來設置一周的第一天。

另一種選擇,不使用PIVOT,而是使用少量CASE

WITH CTE AS
(
    SELECT
         TransactionId 
        ,TransactionDate
        ,DATEPART(WEEK, TransactionDate) AS Week
        ,CASE WHEN TransactionType='Deposit' THEN Amount ELSE 0 END AS Deposit 
        ,CASE WHEN TransactionType='Stake' THEN Amount ELSE 0 END AS Stake 
        ,CASE WHEN TransactionType='Profit' THEN Amount ELSE 0 END AS Profit 
        ,CASE WHEN TransactionType='Withdrawals' THEN Amount ELSE 0 END AS Withdrawals 
        ,Balance
        ,DATEPART(YEAR, TransactionDate) AS Year
    FROM dbo.Transactions
)
SELECT 
  Week,  SUM(Deposit) AS Deposit, SUM(Withdrawals) AS Withdrawals, SUM(Stake) AS Stake, SUM(Profit) AS Profit, 
    (SELECT Balance FROM CTE i WHERE i.TransactionID = MAX(o.TransactionID)) AS BAlance, Year
FROM CTE o
GROUP BY Week, Year

SQLFiddle演示

http://www.sqlfiddle.com/#!3/79d65/89

;WITH cte AS
(
  SELECT datepart(ww, transactiondate) wk,
  sum(CASE WHEN TransactionType = 'Deposit' THEN Amount ELSE 0 END) AS D,
  sum(CASE WHEN TransactionType = 'Withdrawals' THEN Amount ELSE 0 END)  AS W,
  sum(CASE WHEN TransactionType = 'Profit' THEN Amount ELSE 0 END) AS P,
  sum(CASE WHEN TransactionType = 'Stake' THEN Amount ELSE 0 END)  AS S,
  sum(
    CASE WHEN TransactionType = 'Deposit' THEN Amount ELSE 0 END +
    CASE WHEN TransactionType = 'Withdrawals' THEN Amount ELSE 0 END +
    CASE WHEN TransactionType = 'Profit' THEN Amount ELSE 0 END +
    CASE WHEN TransactionType = 'Stake' THEN Amount ELSE 0 END +
    CASE WHEN TransactionType = 'Balance' THEN Amount ELSE 0 END) AS wkTotal
  FROM transactions
  GROUP BY datepart(ww, transactiondate)),
  cte1 AS
  (
    SELECT *, row_number() over (ORDER BY wk) AS rowNum
    FROM cte)
  SELECT wk, d, w, p, s, wktotal
  + coalesce((SELECT top 1 wktotal FROM cte1 x WHERE x.rownum < m.rownum ), 0) AS RunningBalance
FROM cte1 m

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM