如何基于多个指标获取不同的记录

时间:2019-01-07 06:32:44

标签: sql sql-server

我正在使用SQL Server2014。我的数据库包含2个表。 “ DW”和“ STG2”。 DW保留了我的数据的历史记录,而STG表仅保存了以后的每日数据。 DW表的结构如下:HID,票号,ISS_IND。 STG2表的结构仅为HID。两个表中的HID都是相同的,我们可以在查询中显示的ID上加入它们。 DW表的此ISS_IND列可以包含以下值:F,I,U,R,W和Y。如果记录包含F,I或U值,则将其视为同一类别,称为“ Primeissue”,并且该记录包含R,W或Y,则将其视为同一类别,即重新发行。下面是DW表:

HID     Ticketnumber      ISS_IND
1000    123               F
1000    123               I
1000    123               U
1001    456               F
1001    456               R
1001    456               I

STG2表:

 HID
 1000
 1001

现在我们可以注意到,HID 1001具有不同的类别F,即主要发行者和R,其重新发行。现在,我想通过查询来获取此类记录

目前,我刚刚加入他们,到目前为止还无法实现原始发行和重新发行的逻辑。

select 
STG2_SBR_STTK_NWTST.HID,DW_SBR_STTK_NWTST.Ticketnumber
  ,DW_SBR_STTK_NWTST.IS_IND
 from DW_SBR_STTK_NWTST
JOIN STG2_SBR_STTK_NWTST ON STG2_SBR_STTK_NWTST.HID=DW_SBR_STTK_NWTST.HID

输出:

HID   Ticketnumber
1001   456    

有关如何获取此类记录的任何指导?谢谢。

2 个答案:

答案 0 :(得分:2)

DECLARE @DataSource TABLE ( [ID] INT ,[Title] VARCHAR(4) ,[DecimalDigit] TINYINT ); INSERT INTO @DataSource ([ID], [Title], [DecimalDigit]) VALUES (1, 'USD', 2) ,(2, 'EUR', 2) ,(3, 'JYN', 4) ,(4, 'TBH', 0); SELECT '[' + STUFF ( ( SELECT ',{id:' + CAST([ID] AS VARCHAR(12)) + ', title: "' + [Title] + '", decimaldigit:' + CAST([ID] AS VARCHAR(12)) +'}' FROM @DataSource FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)') ,1 ,1 ,'' ) + ']'; 分组,并使用HID子句检查它是否同时具有这两个类别。

HAVING

答案 1 :(得分:0)

另一种可能的方法(基于您的语句)是使用SUM()函数进行计算,并为每个类别获取总和大于0的行:

-- Tables
CREATE TABLE #DW_SBR_STTK_NWTST (
    HID int,
    Ticketnumber int, 
    ISS_IND varchar(1)
)
CREATE TABLE #STG2_SBR_STTK_NWTST
(
    HID int
)
INSERT INTO #DW_SBR_STTK_NWTST
    (HID, Ticketnumber, ISS_IND)
VALUES
    (1000, 123, 'F'),
    (1000, 123, 'I'),
    (1000, 123, 'U'),
    (1001, 456, 'F'),
    (1001, 456, 'R'),
    (1001, 456, 'I')
INSERT INTO #STG2_SBR_STTK_NWTST
    (HID)
VALUES
    (1000),
    (1001)

-- Statement
SELECT 
    #STG2_SBR_STTK_NWTST.HID,
    #DW_SBR_STTK_NWTST.Ticketnumber
FROM #DW_SBR_STTK_NWTST
JOIN #STG2_SBR_STTK_NWTST ON (#STG2_SBR_STTK_NWTST.HID = #DW_SBR_STTK_NWTST.HID)
GROUP BY #STG2_SBR_STTK_NWTST.HID, #DW_SBR_STTK_NWTST.Ticketnumber
HAVING 
    (SUM(CASE WHEN #DW_SBR_STTK_NWTST.ISS_IND IN ('F', 'I', 'U') THEN 1 ELSE 0 END) > 0) AND
    (SUM(CASE WHEN #DW_SBR_STTK_NWTST.ISS_IND IN ('R', 'W', 'Y') THEN 1 ELSE 0 END) > 0)

输出:

HID     Ticketnumber
1001    456