2017-10-11 12 views
-1
ALTER PROCEDURE [dbo].[spGetItemCategories] 
AS 
BEGIN 
    SET NOCOUNT ON; 
    --SELECT * FROM ItemCategories 

    SELECT 
     IC.Id, IC.Name ,C.Id AS CompanyId, C.Name AS CompanName 
    FROM 
     ItemCategories IC 
    JOIN 
     CompanyItems CI ON IC.Id = CI.ItemCategoryId 
    JOIN 
     Companies C ON CI.CompanyId = C.Id 
    --WHERE CI.CompanyId IN (SELECT TOP(100)* FROM Companies C) 
END 

Cette affiche des données comme:Comment fusionner la liste de SQL Server procédure stockée

4 sdfs 14 Nestle 
4 sdfs 15 Unilever 

mais je veux obtenir comme ceci:

4 sdfs 14 Nestle 
      15 Unilever 

check image for code

+0

ou cet équivalent en entityframework –

+1

Vous confondez données wi le rendu d'affichage. Le rendu que vous voyez dans l'onglet Résultats de SSMS n'est pas ce que l'utilisateur final devrait voir (à moins que vous envisagiez de modéliser votre application pour ressembler à SSMS) ... Vouloir forcer la base de données à faire le travail normalement réservé à l'application, causera seulement du chagrin une fois que vous arrivez à l'application. –

Répondre

-1

Vous pouvez vérifier cette méthode mais les mêmes données.

declare @mytable table (compid int,compname varchar(20),itemid int, itemdesc varchar(20)) 

insert into @mytable 
values 
(1,'Company A',100,'Nestle'), 
(1,'Company A',200,'UniLever'), 
(2,'Company B',300,'Citrix'), 
(2,'Company B',400,'SQL'), 
(2,'Company B',500,'Oracle'), 
(1,'Company B',600,'Microsoft') 


select 
iif(left(m1.ord_id,1)>1,NULL,m.compid) [CompID], 
iif(left(m1.ord_id,1)>1,NULL,m.compname) [CompName], 
m.itemid, 
m.itemdesc 
from @mytable m 
inner join (
    select distinct compid,row_number() over (partition by compid order by itemid) [ord_id], itemid 
    from @mytable) m1 
    on m.compid = m1.compid and m.itemid = m1.itemid 

ou CTE

;with cte as 
(
select distinct compid,row_number() over (partition by compid order by itemid) [ord_id], itemid 
from @mytable 
) 
select 
iif(left(m1.ord_id,1)>1,NULL,m.compid) [CompID], 
iif(left(m1.ord_id,1)>1,NULL,m.compname) [CompName], 
m.itemid, 
m.itemdesc 
from @mytable m 
inner join cte m1 
on m.compid = m1.compid and m.itemid = m1.itemid 

si vous n'êtes pas satisfait de nulls remplacent les champs

iif(left(m1.ord_id,1)>1,'',cast(m.compid as varchar)) [CompID], 
iif(left(m1.ord_id,1)>1,'',m.compname) [CompName], 

Résultat

CompID CompName itemid itemdesc 
1  Company A 100  Nestle 
        200  UniLever 
        600  Microsoft 
2  Company B 300  Citrix 
        400  SQL 
        500  Oracle 
+0

Vous passez par beaucoup d'étapes pour la simple présentation. Du point de vue de la base de données, le SQL de l'OP est correct. Je dirais qu'ils doivent réaliser la différence entre la présentation et les données. NULL n'est pas la solution IMO. Tu n'es pas d'accord? – smoore4

+0

pourquoi ne pas créer votre solution @ smoore4 et laissez-moi être le juge. comment ça? – maSTAShuFu

+0

NULL est juste un résultat de SQL, vous pouvez toujours le reformater ... c'est juste un concept qu'il existe une solution. – maSTAShuFu