0

我有四张这样的桌子

表格1:MsPatient

PatientID PatientName
PA001    | Danny andrean
PA002    | John Travolta
PA003    | Danny Lee

表 2:TransactionHeader

TransactionID PatientID TransactionDate
TR001        | PA001   | 2012/12/6
TR002        | PA002   | 2013/11/4
TR003        | PA003   | 2010/4/12

表3:TransactionDetail

TransactionID MedicineID Quantity
TR001        |   ME001  | 5 
TR002        |   ME001  | 6
TR003        |   ME002  | 5

表 4:MsMedicine

MedicineID MedicineName MedicineStock
ME001     |HIVGOD      |100
ME002     |CancerCure  |50

我怎样才能显示购买的药物是“ME001”并且由2个或更多单词组成的显示PatientID、、PatientNameTotalMedicineBought(从购买的药物数量中获得) 。MedicineIDPatientName

例子:

PatientID | PatientName    | Total Medicine Bought 
PA001     | Danny Andrean  | 5
PA002     | John Travolta  | 6

我试过这个查询:

select 
    mp.PatientID,mp.PatientName,SUM(td.Quantity) as TotalMedicineBought 
from 
    MsPatient mp, TransactionDetail td 
inner join 
    TransactionHeader th on th.TransactionID = td.TransactionID 
Group by 
    td.TransactionID, mp.PatientID, mp.PatientName 

我不知道如何创建一个包含两个单词的条件

我使用 SQL Server 2008

4

4 回答 4

0

原始查询的问题在于混合了不同的连接方式。您应该避免在from子句中使用逗号。如果您真的非常想要 a cross join,请使用该cross join语句。

您的问题是过滤正确名称并将表连接在一起:

select p.PatientID, p.PatientName,
       sum(case when MedicineId = 'ME001' then Quantity else 0
           end) as Total_Medicine_Bought
from MsPatient p join
     TransactionHeader th
     on p.PatientID= th.PatientID join
     TransactionDetail td
     on td.TransactionID =th.TransactionID
where PatientName like '% %'
group by p.PatientID, p.PatientName;

此查询还显示了对别名的良好使用。为了便于阅读,这些应该是表名的缩写,而不是任意字母。它还显示了条件聚合的使用。例如,您应该能够轻松地看到如何将查询修改为也显示ME002。患者姓名中至少包含两个部分似乎等同于至少包含一个空格。 like是一种寻找单个空间的简单机制。

于 2013-05-25T12:58:01.440 回答
0

尝试这个

select PatientID ,PatientName,sum(td.Quantity)asTotal Medicine Bought from MsPatient mp
inner join TransactionHeader t on  mp.PatientID = t.PatientID 
inner join TransactionDetail td on t.TransactionID =td.TransactionID 
Group by mp.PatientID,mp.PatientName
于 2013-05-25T10:35:30.773 回答
0

我相信这就是您正在寻找的。我使用您的样本中的数据创建了表,另外还有 2 组用户和事务:Bobby Lee Smith 和 Fred。根据您要求查询只返回姓名中至少有一个空格的患者,我添加了 PATINDEX 子句。这是查询:

 select p.PatientID, p.PatientName, sum(d.Quantity) as 'Total Medicine Bought'
 from   MsPatient p
 join   TransactionHeader h on p.PatientId = h.PatientId
 join   TransactionDetail d on h.TransactionId = d.TransactionId
 where  PATINDEX('% %', p.PatientName) > 0
 group by p.PatientID, p.PatientName

结果如下:

 PatientID      | PatientName      | Total Medicine Bought  
 PA001          | Danny andrean    | 5  
 PA002          | John Travolta    | 6  
 PA003          | Danny Lee        | 5  
 PA004          | Bobby Lee Smith  | 3  

删除 PATINDEX:

 PatientID      | PatientName      | Total Medicine Bought  
 PA001          | Danny andrean    | 5  
 PA002          | John Travolta    | 6  
 PA003          | Danny Lee        | 5  
 PA004          | Bobby Lee Smith  | 3  
 PA005          | Fred             | 5
于 2013-05-25T13:15:22.720 回答
0

您是否正在寻找这样的东西-:

select a.PatientID,a.PatientName,sum(Quantity) Total_Medicine_Bought
from MsPatient a
join TransactionHeader b
on a.PatientID= b.PatientID
join TransactionDetail c
on b.TransactionID =c.TransactionID
where MedicineID='MEOO1' and (Length(a.PatientName) - length(REPLACE(a.PatientName, ' ', '')) + 1)=2
group by a.PatientID,a.PatientName

Sql 小提琴:http ://sqlfiddle.com/#!2/4c2cc/3

于 2013-05-25T10:19:35.193 回答