自定义查询结果

时间:2015-09-30 05:48:50

标签: c# mysql asp.net visual-studio

我有3张桌子

  1. tblIndividual
  2. tblIndividualSpeciality
  3. tblSpeciality
  4. 一个人有多个专业,当我写查询时,我得到很多行取决于个人的专业数量。 我需要单行记录,每个专业都有单列。

    这是表结构

    enter image description here

    我的查询

    SELECT FirstName,LastName,SpecialtyName
    FROM tblindividual ind,tblspecialty spec, tblindividualspecialty indspec    
    where 
    ind.pkIndividualID = indspec.fkIndividualID
    and spec.SpecialtyCode = indspec.SpecialtyCode
    and pkIndividualID = 355735;
    

    我收到了这种格式

    enter image description here

    但我需要这种格式作为结果

    enter image description here

    有人可以帮助我吗? 我使用MySql数据库和开发工具作为Visual Studio 2013。

3 个答案:

答案 0 :(得分:0)

使用PIVOT查询。

以上链接供您参考。

http://forums.asp.net/t/1851916.aspx?Converting+Column+values+to+Rows+in+SQL+Query

此链接对您有所帮助。

我希望你解决了你的问题。

答案 1 :(得分:0)

SELECT FirstName, LastName, SpecialtyName 
FROM tblindividual T1,tblspecialty T2, tblindividualspecialty T3 
WHERE T1.pkIndividualID = T3.fkIndividualID AND T2.SpecialtyCode =T3.SpecialtyCode AND pkIndividualID = 355735;

答案 2 :(得分:0)

你的部分问题是MySQL目前没有相当于SQL的PIVOT,并且在克服它时它也没有内置的ROWNUM概念。

我用两个独立的个人创建了你的桌子,其中第一个人有3个,第二个人有2个。我把它们组合成一个临时表(如果你愿意,可以使用临时表)

INSERT INTO InterimResults
(
SELECT @row_number:=CASE WHEN @indId=pkIndividualId
                    THEN @row_number+1 ELSE 1 END AS row_number,
       @indId:=pkIndividualId AS pkIndividualId, FirstName, LastName,
       SpecialityName
FROM (SELECT @rownum:=0) n, 
     (SELECT @db_names:='') d, 
     (SELECT pkIndividualId,FirstName,LastName,SpecialityName
      FROM tblindividual ind
      inner join tblindividualspeciality indspec on ind.pkIndividualId=indspec.fkIndividualId
      inner join tblspeciality spec on spec.pkSpecialityCode=indspec.fkSpecialityCode) r
);

这给了我以下结果(用我的测试数据)。请注意,如果您在SQLFiddle" Build Schema"窗格所有行号都显示为1,但查询在"运行Sql"面板。

row_number pkIndividualId FirstName LastName   SpecialityName
1          1              Test      I-Health   Internal Medecine 
2          1              Test      I-Health   Family Practise 
3          1              Test      I-Health   Cardiology 
1          2              Test2     J-Health   Family Practise 
2          2              Test2     J-Health   Obstetrics 

然后很简单#" pivot"这个临时表使用GROUP_CONCAT

SELECT  
  FirstName, LastName,  
  GROUP_CONCAT(if(row_number = 1, SpecialityName, NULL)) AS 'Speciality1', 
  GROUP_CONCAT(if(row_number = 2, SpecialityName, NULL)) AS 'Speciality2', 
  GROUP_CONCAT(if(row_number = 3, SpecialityName, NULL)) AS 'Speciality3' 
FROM InterimResults 
GROUP BY pkIndividualId;

我使用的参考资料: http://www.artfulsoftware.com/infotree/qrytip.php?id=78http://blog.sqlauthority.com/2014/03/09/mysql-reset-row-number-for-each-group-partition-by-row-number/

当然这假设您只想报告前3个专业,或者每个人最多只能有3个专业 - 如果还有其他专业那么您需要使用Prepared语句和动态SQL - 有一个例子at http://stratosprovatopoulos.com/web-development/mysql/pivot-table-with-dynamic-columns/