【问题标题】:Select multiple columns with GROUP BY SQL使用 GROUP BY SQL 选择多个列
【发布时间】:2021-01-15 18:34:25
【问题描述】:

我试图从一列中选择最小日期值,同时按另一个具有多个重复值的非唯一 id 列进行分组,并且还希望显示满足前两个条件的相同行。原始数据库列如下所示:

['TransactionDate','TransactionStatusID','DateOfEntry','DateOfService','Amount','TransactionTypeID','PaymentTypeId','PostDate','BillID','ChargeDetailID']

第二张桌子看起来像:

['Amount', 'PracticeID', 'LoadDate', 'DateOfService', 'PerformingProvderID', 'CPTCodeID', 'ChargeDetailID']

我在“ChargeDetailID”上加入这两个表,例如:

SELECT  cd.PatientID, MIN(t.DateOfService) AS "Date Of Service"
FROM ChargeDetail as cd inner join transactions as t on cd.ChargeDetailID = t.ChargeDetailID
WHERE cd.PatientID IS NOT NULL
GROUP BY cd.PatientID   

我从这个查询中得到的结果:

|           PatientID|Date Of Service|
+--------------------+---------------+
|D37224C7-9157-4C5...|     2020-03-30|
|5E693AF8-8332-477...|     2014-01-07|
|8C071F5C-2210-4A6...|     2013-02-14|
|38B11DAE-3FF1-4AD...|     2012-03-14|
|7DB00C43-36F6-40E...|     2009-01-16|
|940EEC5C-4781-4EB...|     2016-12-08|

我想要的结果:


|           PatientID|Date Of Service|  cd.Amount| cd.BillID|
+--------------------+---------------+-----------+----------+
|D37224C7-9157-4C5...|     2020-03-30|   500     |10009
|5E693AF8-8332-477...|     2014-01-07|   250     |1492
|8C071F5C-2210-4A6...|     2013-02-14|  350      |15892
|38B11DAE-3FF1-4AD...|     2012-03-14|  222      |15596
|7DB00C43-36F6-40E...|     2009-01-16|  899      |20566
|940EEC5C-4781-4EB...|     2016-12-08|  650      |9566

【问题讨论】:

    标签: mysql sql sql-server


    【解决方案1】:

    您可以在 group by 中添加 cd.amount 和 cd.billid。但是要求不是很清楚。你也可以使用窗口函数。

    SELECT  cd.PatientID, cd.Amount, cd.BillID, MIN(t.DateOfService) AS "Date Of Service"
    FROM ChargeDetail as cd inner join transactions as t on cd.ChargeDetailID = t.ChargeDetailID
    WHERE cd.PatientID IS NOT NULL
    GROUP BY cd.PatientID , cd.Amount, cd.BillID
    

    【讨论】:

    • 但我希望“cd.PatientID”是唯一的。从该查询中,“cd.PatientID”将有多个条目
    • 我不知道要求。您需要使用上述答案的窗口功能。
    【解决方案2】:

    您可以使用如下窗口功能-

    Select 
        PatientID
      , Amount
      , BillId
      , DateOfService As "Date Of Service"
    from
     (SELECT  
         cd.PatientID
        ,cd.Amount
        ,cd.BillId
        ,t.DateOfService
        ,row_number() over(partition by cd.PatientID order by t.DateOfService asc) as seqnum
    FROM ChargeDetail as cd inner join transactions as t 
    on cd.ChargeDetailID = t.ChargeDetailID
    WHERE cd.PatientID IS NOT NULL) t
    Where t.seqnum = 1;
    

    注意 MySQL 和 SqlServer 是 2 个不同的数据库,但是上述方法应该适用于两者。

    【讨论】:

    • 我们还可以添加 PatientID 匹配的金额总和吗? as cd 内连接事务 as t on cd.ChargeDetailID = t.ChargeDetailID WHERE cd.PatientID IS NOT NULL) GROUP BY PatientID `
    • 是的,我们可以。由于这是一个新要求,我建议您提出一个新问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2011-10-21
    • 2021-03-25
    • 2013-02-16
    • 2022-01-06
    相关资源
    最近更新 更多