通过在表中使用多个列来计算不同的值

时间:2015-05-21 11:06:43

标签: sql-server

请问你能帮我解决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并对其进行计算以确认人数。另请注意,它不应该按顺序放置,因为我之前构成此查询一部分的查询已经相应地对详细信息进行了排序。

老实说,我不知道如何规范这个以获得理想的结果。

希望上述内容有道理,有人可以帮助我。

谢天谢地。

4 个答案:

答案 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