2017-10-23 7 views
-1

この質問では、ここで同等の質問を見つけることができませんでした。これが繰り返しである場合のお詫び 基本的に私は取引のあるテーブルを持っています。各トランザクションには、コードと日時スタンプがあります。私は結果が私は現在、私はすなわち、個々の行に小計を引っ張ることができ、クエリを持って 同じ行の小計を日付でコード別にグループ化する方法

このような
+------------+--------+--------+-------+--------+-------+--------+ 
| DATE | CODE1 | COUNT1 | CODE2 | COUNT2 | CODE3 | COUNT3 | 
+------------+--------+--------+-------+--------+-------+--------+ 
| 2017-01-01 | George |  12 | John |  10 | Ringo | 114 | 
+------------+--------+--------+-------+--------+-------+--------+ 

何かを見ているように、SQLクエリを作成できるようにしたい:

SELECT CONVERT(mytime AS DATE), code, COUNT(*) FROM transactiontable 
GROUP BY CONVERT(mytime AS DATE), code 
ORDER BY CONVERT(mytime AS DATE), code 

だろう私は現在、Cのために別のテーブルを持っていない私に

DATE    CODE  COUNT 
----------------------------------- 
2017-01-01  George  12 
2017-01-01  John  10 

等...

を与えます私はそれを考慮しています。

ありがとうございます!

+0

は、コード/カウント列の数に上限はありますか? – GurV

+0

良い質問です。 100未満、おそらく約50です。 – jj3pa

+0

CONVERT関数のデータ型引数が最初にありません。 CONVERT(DATE、mytime)? – QHarr

答えて

2

また、これを作るためPIVOTを使用することができます。

DECLARE @Table TABLE (DATE DATETIME, CODE VARCHAR(10), [COUNT] INT) 
INSERT INTO @Table 

VALUES 
('2017-01-01','George',12), 
('2017-01-01','John',10) 

;WITH CTE AS 
(
    SELECT RN = ROW_NUMBER() OVER (ORDER BY DATE), * FROM @Table 
) 
SELECT * FROM 
     (SELECT DATE, CONCAT('CODE',RN) RN, CODE Value FROM CTE 
     UNION ALL 
     SELECT DATE, CONCAT('COUNT',RN) RN, CONVERT(VARCHAR,[COUNT]) Value FROM CTE 
     ) SRC 
PIVOT (MAX(Value) FOR RN IN ([CODE1],[COUNT1],[CODE2],[COUNT2])) PVT 

結果:

DATE  CODE1  COUNT1  CODE2 COUNT2 
----------- ----------- ----------- -------- ------- 
2017-01-01 George  12   John  10 
1

あなたはグループを形成し、ピボットに条件付きの集約を使用するように窓関数ROW_NUMBERを使用することができます。

select dt, 
    max(case when rn = 1 then code end) as code_1, 
    max(case when rn = 1 then cnt end) as code_1, 
    max(case when rn = 2 then code end) as code_2, 
    max(case when rn = 2 then cnt end) as code_2, 
    max(case when rn = 3 then code end) as code_3, 
    max(case when rn = 3 then cnt end) as code_3, 
    .... 
from (
    select convert(date, mytime) as dt, 
     code, 
     count(*), 
     row_number() over (partition by convert(date, mytime) order by code) as rn 
    from transactiontable 
    group by convert(date, mytime), code 
    ) t 
group by dt 
order by dt; 
関連する問題