【问题标题】:Making result to look in one single output using two select statements which has where statement使用具有 where 语句的两个 select 语句使结果在单个输出中查找
【发布时间】:2019-03-13 06:45:41
【问题描述】:

我从 select(table1) 开始查询,然后以 where 语句结束,然后再次以 select(table2) 和 where 语句开始,请看一下图片,告诉我,怎么做,谢谢

查询在下方,我得到的输出也在下方。

--//1st select statement //

SELECT
    Measure          = CASE WHEN abd.dosiqID = 'A321'
                                THEN 'C-DIFF'
                           WHEN abd.dosiqID = 'B43'
                               THEN 'MRSA'
                           WHEN abd.dosiqID = 'bill'
                               THEN 'CAUTI'
                           WHEN abd.dosiqID = 'rewq'
                               THEN 'CLABSI'
                       END
    ,SoundPatients   = ram.AccountNumber
    ,DIAG            = abd.dosiqID
    ,SoundPhysicians = rapd.Admitid
    ,LenOfStay       = (CASE WHEN ram.AdmitDateTime IS NULL
                                 THEN 1
                            WHEN DATEDIFF(DAY, ram.AdmitDateTime, COALESCE(vd.DischargeDateTime, GETDATE())) < 1
                                THEN 1
                            ELSE DATEDIFF(DAY, ram.AdmitDateTime, COALESCE(vd.DischargeDateTime, GETDATE()))
                        END
                       )
    ,Pt_Status       = ram.RegistID
INTO sphy
FROM livefdb.dbo.REVERGE_REG     ram
LEFT JOIN livefdb.dbo.ReProrData p ON p.SourceID = ram.SourceID
                                       AND p.VisitID = ram.VisitID
LEFT JOIN livefdb.dbo.HiData     vd ON vd.SourceID = ram.SourceID
                                        AND vd.PatientID = ram.PatientID
                                        AND vd.VisitID = ram.VisitID
                                        AND vd.VisitType_MisRegTypeID = ram.RegistID
JOIN Abgnes                      abd ON abd.SourceID = ram.SourceID
                                         AND abd.VisitID = ram.VisitID
JOIN ReProrData                  rapd ON rapd.SourceID = ram.SourceID
                                          AND rapd.VisitID = ram.VisitID
LEFT OUTER JOIN AbsAcct_Main     abm ON abm.SourceID = ram.SourceID
                                         AND abm.VisitID = ram.VisitID
WHERE
    CAST(ram.AdmitDateTime AS DATE) BETWEEN '20180401' AND '20180930'
    AND ram.Facility_MisFacID IN ('mha', 'bha')
    AND abd.dosiqID IN ('999.32', '996.64', '041.12', '008.45', 'A321', 'B43', 'bill', 'rewq')
    AND rapd.Admitid IN ('DOC1', 'DOC2', 'DOC3', 'DOC4', 'DOC5', 'DOC6', 'DOC7', 'DOC8', 'DOC9')
    AND ram.RegistID IN ('IN', 'INO')


--//2nd select statement //

SELECT
    Measure          = CASE WHEN abd.dosiqID = 'A321'
                                THEN 'C-DIFF'
                           WHEN abd.dosiqID = 'B43'
                               THEN 'MRSA'
                           WHEN abd.dosiqID = 'bill'
                               THEN 'CAUTI'
                           WHEN abd.dosiqID = 'rewq'
                               THEN 'CLABSI'
                       END
    ,TotalPatients   = ram.AccountNumber
    ,DIAG            = abd.dosiqID
    ,SoundPhysicians = rapd.Admitid
    ,LenOfStay       = (CASE WHEN ram.AdmitDateTime IS NULL
                                 THEN 1
                            WHEN DATEDIFF(DAY, ram.AdmitDateTime, COALESCE(vd.DischargeDateTime, GETDATE())) < 1
                                THEN 1
                            ELSE DATEDIFF(DAY, ram.AdmitDateTime, COALESCE(vd.DischargeDateTime, GETDATE()))
                        END
                       )
    ,Pt_Status       = ram.RegistID
INTO sphy2
FROM livefdb.dbo.REVERGE_REG     ram
LEFT JOIN livefdb.dbo.ReProrData p ON p.SourceID = ram.SourceID
                                       AND p.VisitID = ram.VisitID
LEFT JOIN livefdb.dbo.HiData     vd ON vd.SourceID = ram.SourceID
                                        AND vd.PatientID = ram.PatientID
                                        AND vd.VisitID = ram.VisitID
                                        AND vd.VisitType_MisRegTypeID = ram.RegistID
JOIN Abgnes                      abd ON abd.SourceID = ram.SourceID
                                         AND abd.VisitID = ram.VisitID
JOIN ReProrData                  rapd ON rapd.SourceID = ram.SourceID
                                          AND rapd.VisitID = ram.VisitID
WHERE
    CAST(ram.AdmitDateTime AS DATE) BETWEEN '20180401' AND '20180930'
    AND ram.Facility_MisFacID IN ('mha', 'bha')
    AND abd.dosiqID IN ('A321', 'B43', 'bill', 'rewq')
    AND ram.RegistID IN ('IN', 'INO')


DROP TABLE sphy
DROP TABLE sphy2

END 
GO  

对中间结果的聚合查询:

SELECT
    Measure
    ,SoundPatients    = COUNT(*)
    ,TotalPatientDays = SUM(LenOfStay)
FROM Sphy
GROUP BY Measure
ORDER BY Measure

SELECT
    Measure
    ,TotalPatients    = COUNT(*)
    ,TotalPatientDays = SUM(LenOfStay)
FROM Sphy2
GROUP BY Measure
ORDER BY Measure

当前输出:

Measure    SoundPatients    TotalPatientDays
CLABSI         6                   49 
MRSA          33                  219

Measure  TotalPatients    TotalPatientDays
CLABSI      6                49
MRSA        44               290

我想要的输出是:

Measure    SoundPatients    TotalPatients   TotalPatientDays
CLABSI        6                6                49
MRSA          33               44               290

**请记住,我需要数据计数和 lenofstay 总和。如果有任何其他问题或疑问,请告诉我,并在此方面为我提供帮助 **

【问题讨论】:

  • 欢迎来到stackoverflow。请花一分钟时间获取tour,尤其是How to Ask。样本数据最好以DDL + DML 的形式提供。请edit您的问题包括它,您当前的尝试和您想要的结果。更多详情,read this.
  • 请不要使用图片更新您的帖子,并在帖子中显示您想要的内容。
  • 我认为你需要一个左连接
  • 请发布您使用的查询。你会很快得到答复
  • @kreme123 仅仅因为有人要求您发布更多信息并不意味着他们会尽快回复您,甚至根本不会回复。大多数volunteer他们有时间帮助他人的人都有全职工作和其他承诺。如果您希望得到任何帮助,请尊重其他成员。

标签: sql sql-server tsql reporting-services ssms


【解决方案1】:

缺乏逻辑,

select t1.Measure,
 t1.SoundPatients,
 t2.TotalPatients,
 iif ( t1.TotalPatientsDays > t2.TotalPatientsDays ,t1.TotalPatientsDays ,
       t2.TotalPatientsDays
     ) 
 TotalPatientsDays
from   table1 t1
left join table2 t2 on t1.Measure = t2.Measure

编辑 1:

;with o1 as (
 -- your query
)
,o2 as (
 -- your query
)select * into o from o1 join o2 on o1.id = o2.id

declare @server varchar (max) = @@SERVERNAME -- server name has been taken dynamically.
, @sql nvarchar(max)
set @sql = 'exec master..xp_cmdshell ''bcp trainee1.dbo.o out "path\smph_SoundPhy2.csv" -c -t, -T -S "' + @server +  '"''' -- here your DB name and path
print @sql
exec sp_executesql @sql

【讨论】:

  • 此查询返回内部表中的数据,但我不需要数据,我需要汇总输出,例如健全患者的计数、总患者数和总患者天数的总和
  • 我应该看到 soundpatients 和 totalpatients 列的计数以及 toatl patientdays 的总和,您可以编辑并告诉我@IdontKnowEnglish
  • @kreme123 将您的第一个查询放在table1 上,由() 括起来,第二个查询放在table2 上,并由() 括起来......让我知道这就是您的列不在其中的原因查询更新的问题。
  • 我现在又更新了这个问题@IdontKnowEnglish @Alan Schofield
  • @kreme123 与him一起使用
【解决方案2】:

您可以在Measure 字段上加入两个结果。由于sphy 似乎是sphy2 的子集,所以连接应该使用来自sphy2 端的所有记录:

WITH
  output1 (Measure, SoundPatients, TotalPatientDays) AS (
    SELECT Measure, COUNT(*), SUM(LenOfStay) FROM Sphy
    GROUP BY Measure
  ),
  output2 (Measure, TotalPatients, TotalPatientDays) AS (
    SELECT Measure, COUNT(*), SUM(LenOfStay) FROM Sphy2
    GROUP BY Measure
  )
SELECT o2.Measure, o1.SoundPatients, o2.TotalPatients, o2.TotalPatientDays
FROM output2 o2
  LEFT OUTER JOIN output1 o1 ON o2.Measure = o1.Measure
ORDER BY o2.Measure;

【讨论】:

  • 我在底部使用 bcp 命令生成到 csv 的输出,我应该在这一行中使用什么表来进行此查询? exec master..xp_cmdshell 'bcp "select * from livefdb.dbo.o2" queryout "L:\sphy\mph_SoundPhy.csv" -T -c -t "," -S server2'
  • 如果要导出最终结果,请为您的 BCP 命令指定整个语句(以 WITH 开头)。但我认为该命令不会起作用,因为“L”在我看来就像 看到的映射网络驱动器,但 SQL Server 很可能不会。您必须改用 UNC 路径。
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
相关资源
最近更新 更多