1

次のテーブルがあるとします。

╔═════════════════════════════════════╗
║ Name   Date                   Value ║
╠═════════════════════════════════════╣
║ John   2013-01-01 10:20:00    10    ║
║ John   2013-01-01 12:20:11    20    ║
║ Mark   2013-01-01 11:44:10    10    ║
║ Mark   2013-01-02 12:00:00    20    ║
║ Mark   2013-01-03 15:20:00    20    ║
║ Tim    2013-01-01 15:11:12    5     ║
║ Tim    2013-01-03 18:44:44    10    ║
║ Tim    2013-01-03 20:11:00    15    ║
╚═════════════════════════════════════╝

単一のSELECTクエリを使用して、次のように出力します。

╔════════════════════════════════════════════════╗
║ Name    2013-01-01    2013-01-02    2013-01-03 ║
╠════════════════════════════════════════════════╣
║ John    30            0             0          ║
║ Mark    10            20            20         ║
║ Tim     5             0             25         ║
╚════════════════════════════════════════════════╝
  • 3 日間は固定です (2013-01-01、2013-01-02、2013-01-02)。

これを単一でどのように行うのですSELECTか?私は試してみましSUM(DISTINCT)たが、成功しませんでした。論理が解りません。

GROUP BY Nameそれは(私が思うに)だけでなければなりませんが、どのようにSUM()間隔を計算しますか?

4

4 に答える 4

3

これを試して:

SELECT NAME, 
       SUM(CASE 
             WHEN CAST(DATE AS DATE) = '2013-01-01' THEN VALUE 
             ELSE 0 
           END) [2013-01-01], 
       SUM(CASE 
             WHEN CAST(DATE AS DATE) = '2013-01-02' THEN VALUE 
             ELSE 0 
           END) [2013-01-02], 
       SUM(CASE 
             WHEN CAST(DATE AS DATE) = '2013-01-03' THEN VALUE 
             ELSE 0 
           END) [2013-01-03] 
FROM   TABLE1 
GROUP  BY NAME 

SQL Fiddleの実例を見て​​みましょう。

于 2013-09-02T19:13:53.313 に答える
3

If the dates are fixed:

SELECT  [Name],
        SUM(CASE WHEN [Date] >= '20130101' 
            AND [Date] < '20130102' THEN Value END) [2013-01-01],
        SUM(CASE WHEN [Date] >= '20130102' 
            AND [Date] < '20130103' THEN Value END) [2013-01-02],
        SUM(CASE WHEN [Date] >= '20130103' 
            AND [Date] < '20130104' THEN Value END) [2013-01-03]
FROM YourTable
GROUP BY [Name]
于 2013-09-02T19:15:23.263 に答える
2
SELECT NAME, 
    ISNULL([2013-01-01],0) [2013-01-01], 
    ISNULL([2013-01-02],0) [2013-01-02], 
    ISNULL([2013-01-03],0) [2013-01-03]
FROM (
    SELECT NAME, CONVERT(DATE, [Date]) [Date], SUM([Value]) [Value]
    FROM   TABLE1
    GROUP  BY NAME, CONVERT(DATE, [Date])
  ) src
PIVOT (
   SUM([Value])
   FOR [Date]
   IN ( [2013-01-01], [2013-01-02], [2013-01-03])
  ) pvt

日付列は、印刷方法によっては別の方法で指定する必要がある場合があります。

SQL Authority Pivot の例
My SQL Fiddle Example

于 2013-09-02T19:29:40.063 に答える
0

これを試して:

DECLARE @cols AS NVARCHAR(MAX)
       ,@query AS NVARCHAR(MAX)

SELECT @cols = STUFF((
                     SELECT ',' + QUOTENAME(CAST(DATE as DATE))
                     FROM (
                           SELECT DISTINCT CAST(DATE as DATE) DATE FROM #YourTable
                           ) tbl
                     ORDER BY DATE
                     FOR XML PATH('')
                           ,TYPE
                     ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

SET @query = 
       'WITH CTE (
    NAME
    ,DATE
    ,VALUE
    )
AS (
    SELECT NAME
        ,CAST(DATE AS DATE)
        ,Cast(Value AS INT)
    FROM #YourTable
    )
SELECT NAME
    ,' + @cols + '
FROM CTE
PIVOT(SUM(Value) FOR DATE IN (' + @cols + ')) PVT;'

EXECUTE (@query);
于 2013-09-03T22:58:09.147 に答える