请问你能帮我解决MSSQL中的以下问题吗?
我会尽力解释。
首先请记住,MyTable中的所有列都需要在输出报告中报告,即使只使用三列来比较数据。
我有一个MbrNo,DepCode和PracticeNo的表,现在练习可以咨询多个MbrNo并使用同一个MbrNo中的多个DepCode。我要求会员/受扶养人数填写在一个附加栏中,以反映医生咨询的会员数量。但是也应该考虑DepCode。如果医生咨询了1个MbrNo但是3个不同的依赖者,那么计数应该是3,因为MbrNo适用于所有3个依赖者,因此实践咨询了3个人。
MbrNo | DepCode | PracticeNo | Adress | Email | TelNo
123 01 A XY XY XY
1234 00 B XY XY XY
1234 00 B XY XY XY
1245 00 C XY XY XY
123 02 A XY XY XY
1234 02 B XY XY XY
1233 01 A XY XY XY
1233 00 B XY XY XY
MbrNo | DepCode | PracticeNo | Adress | Email | TelNo | MemberCount
123 01 A XY XY XY 3
1234 00 B XY XY XY 3
1234 00 B XY XY XY 3
1245 00 C XY XY XY 1
123 02 A XY XY XY 3
1234 02 B XY XY XY 3
1233 01 A XY XY XY 3
1233 00 B XY XY XY 3
提供商B = 3 MemberCount,因为提供商咨询了相同的成员X 2并对其进行计算以确认人数。另请注意,它不应该按顺序放置,因为我之前构成此查询一部分的查询已经相应地对详细信息进行了排序。
老实说,我不知道如何规范这个以获得理想的结果。
希望上述内容有道理,有人可以帮助我。
谢天谢地。
答案 0 :(得分:2)
使用CROSS APPLY计算唯一匹配项:
测试数据
DECLARE @t table
( MbrNo int, DepCode int, PracticeNo char(1), Adress char(2),
Email char(2), TelNo char(2))
insert @t values
(123,'01','A','XY','XY','XY')
,(1234,'00','B','XY','XY','XY')
,(1234,'00','B','XY','XY','XY')
,(1245,'00','C','XY','XY','XY')
,(123,'02','A','XY','XY','XY')
,(1234,'02','B','XY','XY','XY')
,(1233,'01','A','XY','XY','XY')
,(1233,'00','B','XY','XY','XY')
查询测试数据:
SELECT
t1.MbrNo,
t1.DepCode,
t1.PracticeNo,
t1.Adress,
t1.Email,
t1.TelNo,
z.MemberCount
FROM @t t1
CROSS APPLY
(SELECT count(*) MemberCount
FROM (SELECT null x
FROM @t
WHERE
t1.PracticeNo = PracticeNo
GROUP BY MbrNo, DepCode)y) z
结果:
MbrNo DepCode PracticeNo Adress Email TelNo MemberCount
123 1 A XY XY XY 3
1234 0 B XY XY XY 3
1234 0 B XY XY XY 3
1245 0 C XY XY XY 1
123 2 A XY XY XY 3
1234 2 B XY XY XY 3
1233 1 A XY XY XY 3
1233 0 B XY XY XY 3
答案 1 :(得分:1)
如果我理解,你想要这样的东西:
SELECT MbrNo, DepCode, PracticeNo, Adress, Email, TelNo, c.total
FROM
table t
LEFT JOIN (
SELECT MbrNo, DepCode, PracticeNo, count(*) as total
FROM table
GROUP BY (MbrNo, DepCode, PracticeNo)
) c on (c.MbrNo = t.MbrNo and c.DepCode = t.DepCode and c.PracticeNo = t.PracticeNo)
答案 2 :(得分:1)
好的我已经编辑了答案以替换我以前的答案,因为这是实际的正确答案:
SELECT t.MbrNo, t.DepCode, t.PracticeNo, Adress, Email, TelNo, c.total
FROM
table t
LEFT JOIN (
SELECT PracticeNo, SUM(total) total
from
( SELECT MbrNo, DepCode, PracticeNo, count(distinct DepCode) as total
FROM table
GROUP BY MbrNo, DepCode, PracticeNo) a
GROUP BY PracticeNo
) c on (c.PracticeNo = t.PracticeNo)
我可能错了,可能会有比我更聪明的人使用SQL,但是我不确定是否有更好的方法可以在没有其他视图的情况下获得Total per Practice No
这可能是更好的方式
;WITH aTable (MbrNo, DepCode, PracticeNo, total)
AS
(
SELECT MbrNo, DepCode, PracticeNo, count(distinct DepCode) as total
FROM table
GROUP BY MbrNo, DepCode, PracticeNo
)
SELECT t.MbrNo, t.DepCode, t.PracticeNo, Adress, Email, TelNo, (Select SUM(total) from aTable where PracticeNo = t.PracticeNo)
FROM
table t
答案 3 :(得分:0)
非常感谢帮助,我真的很感激。我确信所有上述查询都有效但对我来说有点高级,因为我在这里和那里只用了3个月的SQL。 以下是我采取的路线,也给了我所需的结果。它可能不是最好的,但现在它至少是我理解的。 我决定创建一个将MbrNo与DepCode和Practice Number相结合的唯一编号。然后对唯一引用进行计数,然后将原始表与计数再次加入到较新的表中。
ALTER TABLE
Table1
ADD
UniqueMemberDep2 VARCHAR(MAX) NULL
UPDATE
Table1
SET UniqueMemberDep2 = CONCAT(MbrNo, DepNo, PracticeNo)
SELECT
PracticeNo, COUNT(Distinct UniqueMemberDep2) as ProviderMemberCount
INTO Temp
FROM Table1
GROUP BY PracticeNo
SELECT Table1.*, Temp.ProviderMemberCount
into Table2 FROM Table1 LEFT JOIN Temp on
Table1.PracticeNo = Temp.PracticeNo
Select * from Table2
DROP TABLE Table1
DROP TABLE Temp