11

Ho questa domanda, ma la sua non funziona come dovrebbe,ottenendo "Nessuna colonna è stata specificata per la colonna 2 di" d "" in sql server cte?

with c as (select 
       month(bookingdate) as duration, 
       count(*) as totalbookings 
      from 
       entbookings 
      group by month(bookingdate) 
     ), 
    d as (SELECT 
       duration, 
       sum(totalitems) 
      FROM 
       [DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty 
      group by duration 
     ) 

select 
    c.duration, 
    c.totalbookings, 
    d.bkdqty 
from 
    c 
    inner join d 
    on c.duration = d.duration 

quando corro questo, sto ottenendo

Msg 8155, livello 16, stato 2, riga 1
Nessuna colonna è stata specificata per la colonna 2 di "d".

Si può dirmi che cosa sto facendo male?

Inoltre, quando si esegue questo,

with c as (select 
       month(bookingdate) as duration, 
       count(*) as totalbookings 
      from 
       entbookings 
      group by month(bookingdate) 
     ), 
    d as (select 
       month(clothdeliverydate), 
       SUM(CONVERT(INT, deliveredqty)) 
      FROM 
       barcodetable 
      where 
       month(clothdeliverydate) is not null 
       group by month(clothdeliverydate) 
     ) 

select 
    c.duration, 
    c.totalbookings, 
    d.bkdqty 
from 
    c 
    inner join d 
    on c.duration = d.duration 

ottengo

Msg 8155, livello 16, stato 2, riga 1
No colonna è stata specificata per la colonna 1 di 'd '.
messaggio 8155, livello 16, stato 2, riga 1
Nessuna colonna è stata specificata per la colonna 2 di "d".

+0

hai ancora bisogno di sapere come avere il netBalance? – MimiEAM

risposta

11

[modifica]

ho provato a riscrivere la tua ricerca, ma anche la tua lavorerò una volta che gli alias associati alle colonne di aggregazione nella query che definisce 'd'.


Penso che si sta cercando il seguente:

Primo uno:

select 
    c.duration, 
    c.totalbookings, 
    d.bkdqty 
from 
    (select 
       month(bookingdate) as duration, 
       count(*) as totalbookings 
      from 
       entbookings 
      group by month(bookingdate) 
    ) AS c 
    inner join 
    (SELECT 
       duration, 
       sum(totalitems) 'bkdqty' 
      FROM 
       [DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty 
      group by duration 
    ) AS d 
    on c.duration = d.duration 

secondo:

select 
    c.duration, 
    c.totalbookings, 
    d.bkdqty 
from 
    (select 
       month(bookingdate) as duration, 
       count(*) as totalbookings 
      from 
       entbookings 
      group by month(bookingdate) 
    ) AS c 
    inner join 
    (select 
       month(clothdeliverydate) 'clothdeliverydatemonth', 
       SUM(CONVERT(INT, deliveredqty)) 'bkdqty' 
      FROM 
       barcodetable 
      where 
       month(clothdeliverydate) is not null 
       group by month(clothdeliverydate) 
    ) AS d 
    on c.duration = d.duration 
+0

No! questo non funziona, per il primo ha mostrato 'Msg 8155, livello 16, stato 2, riga 1 Non è stata specificata alcuna colonna per la colonna 2 di 'd'. Msg 207, livello 16, stato 1, riga 4 Nome colonna non valido 'bkdqty'' per il 2 ° mostra 'Msg 8155, livello 16, stato 2, riga 1 Nessuna colonna è stata specificata per la colonna 1 di' d'. messaggio 8155, livello 16, stato 2, riga 1 Nessuna colonna è stata specificata per la colonna 2 di "d". messaggio 207, livello 16, stato 1, riga 23 Nome colonna non valido 'durata'. messaggio 207, livello 16, stato 1, riga 4 Nome colonna non valido 'bkdqty'. ' – Razort4x

+4

L'errore consiste nel non nominare le colonne aggregate nella query che definisce 'd' in entrambe le posizioni. Ho provato a correggerlo, puoi verificare? – Vikdor

+2

f * ck sì uomo! Ha funzionato! molte grazie! :-) tu sei un salvatore di vita. Una cosa però sarebbe 'mese (clothdeliverydate) 'durata'' perché funzioni, altrimenti continua a dire che non è possibile trovare la durata della colonna. – Razort4x

15

Hai solo bisogno di fornire un alias per il vostro aggregato colonne nel CTE

d as (SELECT 
    duration, 
    sum(totalitems) as sumtotalitems 
FROM 
    [DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty 
group by duration 
) 
3

Poiché si sta creatin un'espressione di tabella, è necessario specificare la struttura di tale tabella, è possibile raggiungere questo obiettivo in due modi:

1: Nella select è possibile utilizzare le columnnames originali (come nel tuo primo esempio), ma con gli aggregati è necessario utilizzare un alias (anche nei nomi in conflitto). Come

sum(totalitems) as bkdqty 

2: è necessario specificare i nomi delle colonne rigth dopo il nome del talbe, e poi devi solo fare in modo che il conteggio dei nomi dovrebbe mach il numero di coulms è stato selezionato nella query . Come:

d (duration, bkdqty) 
AS (Select....) 

Con la seconda soluzione entrambe le query funzioneranno!

2

Piuttosto un messaggio di errore intuitiva - solo bisogno di dare le colonne nei nomi d

Change né dalla presente

d as 
(
    select     
    [duration] = month(clothdeliverydate),     
    [bkdqty] = SUM(CONVERT(INT, deliveredqty))    
    FROM     
    barcodetable    
    where     
    month(clothdeliverydate) is not null     
    group by month(clothdeliverydate)   
) 

Oppure si può dichiarare esplicitamente i campi nella definizione del CTE:

1

Basta aggiungere un nome alias come segue
somma (totalitems) come totale.

0

evidentemente, come indicato nella risposta del parser, è necessario un nome di colonna per entrambi i casi. In entrambe le versioni le colonne di "d" non sono nominate.

nel caso 1: la colonna 2 di d è sum(totalitems) che non è denominata. duration manterrà il nome di "durata"

nel caso 2: sia month(clothdeliverydate) e SUM(CONVERT(INT, deliveredqty)) devono essere nominato

3

ho avuto una query simile e un problema simile.

SELECT 
    * 
FROM 
    Users ru 
    LEFT OUTER JOIN 
    (
     SELECT ru1.UserID, COUNT(*) 
     FROM Referral r 
     LEFT OUTER JOIN Users ru1 ON r.ReferredUserId = ru1.UserID 
     GROUP BY ru1.UserID 
    ) ReferralTotalCount ON ru.UserID = ReferralTotalCount.UserID 

ho scoperto che SQL Server è stato soffocando sulla colonna COUNT(*), e mi dava l'errore No colonna è stata specificata per la colonna 2.

Inserendo un alias sulla colonna COUNT(*) risolto il problema.

SELECT 
     * 
    FROM 
     Users ru 
     LEFT OUTER JOIN 
     (
      SELECT ru1.UserID, COUNT(*) AS -->MyCount<-- 
      FROM Referral r 
      LEFT OUTER JOIN Users ru1 ON r.ReferredUserId = ru1.UserID 
      GROUP BY ru1.UserID 
     ) ReferralTotalCount ON ru.UserID = ReferralTotalCount.UserID 
Problemi correlati