簡體   English   中英

選擇日期列時,SQL 2計數或2和

[英]SQL 2 counts or 2 sums when a date column is selected

我一直在試圖解決這個問題,但無法正確解決。

我想選擇ID,表S日期,Type = 1和Type = 2的數量的2個不同計數,其中表P中的日期> =表S中的最大日期(注= J),以及之間的日期差最大表格P日期和表格S日期。

表格數據示例:

Table S     
Date          ID    Note
2/26/2014   688606  J
2/14/2014   688606  J


Table P 
Date          ID    Type
7/10/2015   688606  1
7/9/2015    688606  1
7/8/2015    688606  1
7/7/2015    688606  2
1/2/2010    688606  1
1/1/2010    688606  2

理想結果集:

S.Date      S.ID    P.MaxDate   P.T1Count   P.T2Count   P.DateDiff
2/26/2014   688606  7/10/2015       3            1         499

我已經嘗試過SUM,但是由於SUM需要分組依據並且日期都是唯一的,因此我不知道如何合並日期。

我嘗試通過ID對分區進行計數,但這使計數包括表P中的所有數據,而不僅僅是日期> =表S的那些。

任何幫助都非常感謝。

謝謝,

這是我僅需1個即可完成的工作:

SELECT 
S.ID,
S.DATE as SDATE,
P.DATE as PDATE,
P.TYPE,
COUNT(P.DATE) OVER (PARTITION BY P.ID) as NBR_T1,
(P.DATE - S.DATE)as NBR_DATES
FROM
P
JOIN 
(
SELECT
DISTINCT(S.ID),
S.DATE,
S.NOTE 
FROM 
S
WHERE 
S.DATE = (SELECT MAX(SS.DATE)
FROM SS
WHERE SS.ID = S.ID
AND SS.NOTE = 'J')
AND S.ID = '688606'
) S ON P.ID = S.ID
WHERE
P.TYPE = '1' 
AND P.ID = '688606'
AND P.DATE >= S.DATE

ORDER BY 
P.DATE DESC

如果您確實只有2種類型,則此解決方案將起作用。 如果您有N個類型,因此要使用N個列,則需要使用PivotTable

希望這會有所幫助。

    USE SomeDB;

    CREATE TABLE S (dt DATETIME NOT NULL, sTableid INT NOT NULL);

    INSERT INTO S VALUES ('2/26/2014', 688606), ('2/14/2014', 688606);

    CREATE TABLE P (dt DATETIME NOT NULL, pTableid INT NOT NULL, typeID INT NOT NULL);

    INSERT INTO P VALUES 
    ('7/10/2015', 688606, 1),
    ('7/9/2015', 688606, 1),
    ('7/8/2015', 688606,  1),
    ('7/7/2015', 688606, 2),
    ('1/2/2010', 688606, 1),
    ('1/1/2010', 688606,  2);

    WITH tmp AS (
    SELECT pTableid, p.typeID, MAX(dt) maxDate, COUNT(1) cnt
    FROM dbo.P
    GROUP BY pTableid, p.typeID
    )
SELECT s.dt, 
    s.sTableid, 
    (SELECT MAX(maxDate) FROM tmp WHERE tmp.pTableid = s.sTableid) maxDateOfAnyType,
    (SELECT cnt FROM tmp WHERE tmp.pTableid = s.sTableid AND tmp.typeID = 1) t1Count,
    (SELECT cnt FROM tmp WHERE tmp.pTableid = s.sTableid AND tmp.typeID = 2) t2Count,
    DATEDIFF(DAY, s.dt, (SELECT MAX(maxDate) FROM tmp WHERE tmp.pTableid = s.sTableid)) daysBetween
FROM dbo.S s    

    DROP TABLE S;
    DROP TABLE P;

如果首先在S聚合數據(為此我喜歡CTE),然后將必要的聚合應用於P的相應數據,那么這可能是最簡單的。 像這樣:

-- Sample data.
declare @s table ([Date] date, [ID] bigint, [Note] char(1));
insert @s values
    ('2014-02-26', 688606, 'J'),
    ('2014-02-14', 688606, 'J');

declare @p table ([Date] date, [ID] bigint, [Type] int);
insert @p values
    ('2015-07-10', 688606, 1),
    ('2015-07-09', 688606, 1),
    ('2015-07-08', 688606, 1),
    ('2015-07-07', 688606, 2),
    ('2010-01-02', 688606, 1),
    ('2010-01-01', 688606, 2);

-- Step 1: Aggregate and filter the records you want in @s.
with [GroupS] as
(
    select
        [S].[ID],
        [Date] = max([S].[Date])
    from
        @s [S]
    where
        [S].[Note] = 'J'
    group by
        [S].[ID]
)

-- Step 2: Aggregate the corresponding records in @p.
select
    [S.Date] = [GroupS].[Date],
    [S.ID] = [GroupS].[ID],
    [P.MaxDate] = max([P].[Date]),
    [P.T1Count] = sum(case [P].[Type] when 1 then 1 else 0 end),
    [P.T2Count] = sum(case [P].[Type] when 2 then 1 else 0 end),
    [P.DateDiff] = datediff(day, [GroupS].[Date], max([P].[Date]))
from
    [GroupS]
    inner join @p [P] on [GroupS].[ID] = [P].[ID]
where
    [GroupS].[Date] <= [P].[Date]
group by
    [GroupS].[Date],
    [GroupS].[ID];

另一種執行方法...我假設您已經創建了表SP並使用SQL Server 2012+

Declare @MDate datetime
SELECT @MDate = MAX(SS.DATE) FROM S SS WHERE SS.NOTE = 'J'

Select S.Date, S.ID, Max(P.Date) as 'MaxDate', 
COUNT(IIF(convert(int,P.Type)=1, 1, NULL)) AS T1Count,
COUNT(IIF(convert(int,P.Type)=2, 1, NULL)) AS T2Count,
datediff(day, S.Date, Max(P.Date)) as 'DateDiff' from P 
inner join S on P.ID = S.ID and S.Date >= @MDate
and P.Date >= @MDate
group by S.Date, S.ID

暫無
暫無

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

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